Android Kotlinで引数にclassを渡すには?正しい書き方

Android開発において次の場面に遭遇

  • メソッドに *.class  = クラスを引数で渡したい
  • 例えば別Activityを起動する時とか、
  • kotlinだとどうやればクラスを渡せるの?

Javaに慣れているとkotlinで少し悩みます。

それには少し表現を変えるだけなので、
Kotlinでclassを引数で渡す方法をまとめました。

Javaではクラスリテラル *.class で引数渡しできた

Kotlinではなく、旧来のJavaの場合。

Activityクラスなどを次の形式で表しました。

▼ こういう表現(クラスリテラル)

上記の *.class のような表現はクラスリテラルと呼ばれます。実際はClassオブジェクトであり、 MainActivity.class.getName()  などのメタ情報の取得にも使えます。

Android開発でもよく見かける書き方です。

そもそもクラスリテラルとは何か(脱線)

クラスリテラルは聞きなれない言葉です。

そこでググると分かりやすい解説を見つけました。

▼ クラスリテラルって何だ?…に対する答え

Classクラスは、クラスを表すクラスです。リフレクションの中心的存在です。Classクラスの定義はClass<T>のようにジェネリクス付きになっています。Tには表しているクラスが指定されます。

全てのクラスには、classというstaticフィールドのようなもの(後述)が暗黙的に作成されています。このフィールドのようなものには、そのクラスを表すClassインスタンスが代入されています。

.classは正確には「クラスリテラル」と呼ばれるリテラルで、フィールドではありません(参考URL)。ただし、前述の説明ではイメージ重視で「フィールドのようなもの」として説明しています。

これに加えて、全てのクラスにはgetClass()メソッドが定義されています(java.lang.Objectクラスで定義されています)。このメソッドの戻り値は、.classと同じ「そのクラスを表すClassインスタンス」です。

引用元 : 入門Javaリフレクション

元々リフレクションの機能としてメタ的なClassクラスが用意されていて、 .class  あるいは .getClass()  はそれにアクセスする手段とのことです。

そして .class  の方を「クラスリテラル」と呼んでいる……

言葉の定義はそんな感じみたいですね。

Androidでクラスリテラルを使う代表例

もっとも目にするのは別Activityに遷移するコードとかです。

▼ 例えば別Activityを開きたい場合など

こういうとこでクラスリテラルって使われてます。

同じことをKotlinでしたかったです。

KotlinではJava的なクラスリテラルは使えない

ここからはKotlinでの話。

残念ながらJava的クラスリテラルは使えません。

▼ このような書き方は不正。ダメ

このような記述はKotlinには存在しないからエラーになります。KotlinではJava的クラスリテラルの代用があるかどうかも分からないです。

少なくともKotlin自体にはクラスリテラルは存在しないみたいです。というか Kotlin ⇒ Java ⇒ クラスリテラル のように経由して呼び出せるみたい(後述)

Kotlinでクラスを引数に渡すなら ::class を使う

それではclassを引数に渡す正しい方法について

結論から書くと ::class.java を使えばいいです。

▼ つまりは次のような書き方

初めて見ると「なんだこれ?」となる書き方ですが、この記述はJavaにおける MainActivity.class  と同じく使えます( = Classオブジェクト)

Kotlinではこのようにしか書けません。

Kotlinで別ActivityをIntentから開く書き方例

最後に具体的かつ実用的な例を1つだけ紹介

Intentから別Activityなどを開く場合です。

▼ Kotlinではこのように書くのが正解

こうするのがKotlinにおける正しい方法です。

知らないと少し困るかもしれません。

以上、Kotlinで引数にclassを渡す方法でした。ではまた