kotlin - Foo::class.java 和 Foo::javaClass 有什么区别?

标签 kotlin

显然我需要初始化我的记录器:

val LOGGER : Logger = LoggerFactory.getLogger(Foo::class.java);

如果我这样做:

val LOGGER : Logger = LoggerFactory.getLogger(Foo::javaClass);

它提示参数类型与getLogger不兼容.但是根据 API,两者都是 Class<Foo> .它们有何不同?

最佳答案

javaClass是一个扩展属性,它返回实例化 objectruntime Java 类。在您的情况下,它被用作属性引用,这将为您提供 KProperty1<Foo, Class<Foo>>表示扩展函数本身:

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

您可以将它与接收器结合使用,例如如果 Foo提供了一个默认构造函数,你可以说:

Foo::javaClass.get(Foo())

可以简化为:

Foo().javaClass

使用 ::class.java另一方面,为您提供 Java Class<?>"class references" 中所述直接地。一个简单示例中的所有三种可能性:

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

关于kotlin - Foo::class.java 和 Foo::javaClass 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627421/

相关文章:

arrays - Kotlin:泛型数组

android - 有没有办法停止在 Android 仪器测试 Kotlin (ActivityTestRule) 中启动 Activity

android - travis ci 构建失败 - 原因 : PermGen space

android - 在 JNI 中使用错误代码将 jbytearray 转换为 char*

kotlin - 该循环的功能等效项

android - keystore 异常 : Signature/MAC verification failed when trying to decrypt

java - Android Gradle 中版本依赖冲突

Kotlin 关于 @ 符号和返回后缀的澄清

kotlin - Corda - 包含该软件包的 CorDapp 不止一个

kotlin - Kotlin Coroutine 的 block.startCoroutine() 是如何工作的?