T::class
はKClass<T>
ですが、t::class
はKClass<out T>
となります。次のことを考えてみましょう:
class Foo {
val foo = 2
val bar = 3
}
fun f() {
val any: Any = Foo()
any::class.memberProperties.forEach {
println(it.get(2)) // Oops
}
}
これは、本質的に2.foo
と2.bar
にアクセスしようとしていましたが、それは代わりにタイプAny
のパラメータを可能にする注意の側にget
ERRSので、許可されていません。ただし、t.javaClass.kotlin
を実行するとKClass<T>
が生成されます。上記のように誤解すると、IllegalArgumentException
が発生します。
あなたが
KClass
タイプと他には何のためになることをコンパイル時の保証を提供することにより、コンパイラにいくつかのより多くの助けを与えることができます
:それは指定することが可能かどう
private inline fun <reified A : Annotation, reified T : Any> foo(target: T) {
T::class.memberProperties
.filter { it.annotations.any { annotation -> annotation is A } }
.forEach {
println(it.get(target))
}
}
は、残念ながら、私にはわかりません推測しながらA
T
target
から。私はそれをfoo<Attr, Bar>(bar)
のように呼び出す方法を見つけていない。
private inline fun <reified A : Annotation> foo(target: Any) {
target.javaClass.kotlin.memberProperties
.filter { it.annotations.any { annotation -> annotation is A } }
.forEach {
println(it.get(target))
}
}
我々は両方のケースで同じオブジェクトを渡すので、これは上記の問題に実行されません知っている:私はそれが少ないポータブルだ賭けると思いますけれども
また、あなたは、javaClass
を通過することができます。これは呼び出し元の側でもうまく見えます。これは、移植性ヒットの価値があるかもしれません。
代わりに 'target.javaClass.kotlin.memberProperties'を実行すると、' T'をまったく指定する必要はありません。 – Todd
@トッド、面白い、なぜ彼らが異なるのだろうか。 – chris