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