2017-10-08 22 views

答えて

5

javaClassとして定義KClassのプロパティはインスタンス化オブジェクトランタイムJavaクラスを返す拡張プロパティです。あなたのケースでは、あなたの拡張機能自体を表すKProperty1<Foo, Class<Foo>>を与えるプロパティのリファレンスとして使用されている:

val T.javaClass: java.lang.Class<T> 

あなたは、例えば、受信機との組み合わせで、これを使用することができますFooは、デフォルトコンストラクタを提供している場合、あなたは言うことができる:のように簡略化することができる

Foo::javaClass.get(Foo()) 

:直接"class references"で説明したように

Foo().javaClass 

一方::class.javaを使用するには、あなたのJava Class<?>を与えます。簡単な例ではすべての3つの可能性:

val kProperty1: KProperty1<Foo, Class<Foo>> = Foo::javaClass 
kProperty1.get(Foo()) //class de.swirtz.kotlin.misc.Foo 
Foo::class.java //class de.swirtz.kotlin.misc.Foo 
Foo().javaClass //class de.swirtz.kotlin.misc.Foo 
2

Foo::javaClassだから、あなたがfoo.javaClassのようなFooのインスタンスの上でそれを呼び出す必要があるだろう

inline val <T : Any> T.javaClass: Class<T> 

として定義valへの参照です。

Foo::classはあなたにFoojavaの実際のKClassを与える

val <T> KClass<T>.java: Class<T> 
4

javaClassオブジェクトのランタイムJavaクラスを返す拡張プロパティです。

/** 
* Returns the runtime Java class of this object. 
*/ 
public inline val <T: Any> T.javaClass : Class<T> 
    @Suppress("UsePropertyAccessSyntax") 
    get() = (this as java.lang.Object).getClass() as Class<T> 

それは、例えば、クラスのインスタンスで呼び出すことができます。

println(Foo().javaClass) //class Foo 

しかし、Foo::javaClassはあなたを与える代わりに取得するのに使用できるJavaクラスのインスタンスのタイプKProperty1<Foo, Class<Foo>>property reference反射スルーFooのインスタンスのクラス:

val p: KProperty1<Foo, Class<Foo>> = Foo::javaClass 
println(p.get(Foo())) //p.get(Foo()) returns a Java class Foo 

したがって、を渡すために間違っています210〜LoggerFactory.getLogger()は、Javaクラスを受け入れます。

関連する問題