Kotlin 什么';Foo::class.java和Foo::javaClass之间的区别是什么?

Kotlin 什么';Foo::class.java和Foo::javaClass之间的区别是什么?,kotlin,Kotlin,要初始化我的记录器,我需要: val LOGGER : Logger = LoggerFactory.getLogger(Foo::class.java); 如果我这样做: val LOGGER : Logger = LoggerFactory.getLogger(Foo::javaClass); 它抱怨参数类型与getLogger不兼容。然而,根据API,两者都是类。它们有何不同?是对定义为 inline val <T : Any> T.javaClass: Class<

要初始化我的记录器,我需要:

val LOGGER : Logger = LoggerFactory.getLogger(Foo::class.java);
如果我这样做:

val LOGGER : Logger = LoggerFactory.getLogger(Foo::javaClass);
它抱怨参数类型与
getLogger
不兼容。然而,根据API,两者都是
。它们有何不同?

是对定义为

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

javaClass
是一个扩展属性,它返回实例化的对象的运行时Java类。在您的情况下,它被用作属性引用,这将为您提供一个表示扩展函数本身的
KProperty1

val T.javaClass: java.lang.Class<T>
可简化为:

Foo().javaClass
另一方面,使用
::class.java
可以直接获得中所述的java
类。在一个简单的例子中,所有三种可能性都是:

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
val kProperty1:kProperty1=Foo::javaClass
kProperty1.get(Foo())//类de.swirtz.kotlin.misc.Foo
Foo::class.java//class de.swirtz.kotlin.misc.Foo
Foo().javaClass//class de.swirtz.kotlin.misc.Foo

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>
但是,
Foo::javaClass
为您提供了一个of类型,而不是一个Java类实例,该实例可用于通过反射获取
Foo
实例的类:

val p: KProperty1<Foo, Class<Foo>> = Foo::javaClass
println(p.get(Foo()))    //p.get(Foo()) returns a Java class Foo
val p:KProperty1=Foo::javaClass
println(p.get(Foo())//p.get(Foo())返回一个Java类Foo
因此,将
KProperty
传递给接受Java类的
LoggerFactory.getLogger()
是错误的

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