2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Kotlin】KTypeとKClassのちがいが知りたい

Posted at

クラス ≠ 型

KClassは、クラス定義そのものの情報。
KTypeは、変数の型情報。

「クラス」は「型」の情報の一部。「クラス」=「型」ではない

たとえば、変数の型はNullableで宣言できる。

class Something(
  val str: String?
)

Nullabilityは変数の型としての情報であって、クラス自体の定義にはふくまれない。

このように「型」は「クラス」が含まない情報を持つことがあるので、
Kotlinはこれらを区別し、それぞれKTypeKClassというクラスを与えている。

実用面

リフレクションでクラスのフィールドの型情報を取得するようなケースだと、KTypeで扱ったほうが都合がよさそうだ。

たとえば、クラスにジェネリクス変数(type parameter)を持ったフィールド、典型的にはList型があるとする。

class Something2(
  val list: List<String>
)

リフレクションでフィールドの型情報を収集したいとき、KClassからは型のジェネリクス変数のクラス情報(List<String>でいうString)までは取得できない1
KClassは単なるクラス定義で、クラス定義上ではジェネリクス変数は具体的な型情報を持たないからだ。
この点KTypeはジェネリクス変数のクラス情報まで取得できる2。ありがたい。

このほか、Nullablilityだとかの型としての情報が欲しければ、KType
クラスのコンストラクタ情報が欲しいだとかは、KClassをつかう。ちがいが分かれば、使い分けはそこまで難しくない。

むすびと参考

リフレクションでフィールドのList<String>でいうString相当の情報がとれず時間を使ったので、として置いておきます。
JavaにはKTypeに相当するものがあった記憶がありません。あったのかな…

参考サイト
https://discuss.kotlinlang.org/t/why-is-kclass-not-a-ktype/3341

  1. KClass#typeParametersというそれっぽいAPIはありますが、こいつは型パラメータそのもの("out T"とか)を返す模様です

  2. 型のクラスが持つジェネリクス変数のクラス情報はKType#argumentsでとれます。「型のクラスが持つジェネリクス変数のクラス情報」:thinking:

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?