如果 Kotlin 函数调用具体化了一个原语,比如说Int
,“通过”类是装箱原语的类,而不是未装箱版本的类。
inline fun <reified T> reify() = T::class
@Test fun reified_type_doesnt_match_for_primitive() {
assertNotEquals(Int::class, reify<Int>())
assertNotEquals(Int::class.java, reify<Int>().java)
assertNotEquals<Any>(Int::class, reify<Int?>())
val nullableInt: Int? = 42
assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>())
assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java)
}
@Test fun reified_type_matches_for_class() {
assertEquals(String::class, reify<String>())
}
这是一个错误吗?
这有点令人困惑,但当前的行为是设计使然。与我们治疗的方法相比,这种方法有一个重大好处T::class.java
作为一个原始类。如果函数有一个类型的参数T
,它的 Java 类始终等于T::class.java
在运行时(假设T
是最终的)。这实际上是一件非常明智的事情:
inline fun <reified T : Any> foo(t: T) {
assert(T::class.java == t.javaClass)
}
发生这种情况是因为泛型类型的参数T
只能在运行时有一个参考值,如果T
是一个原始类型。
另请参阅 Kotlin 论坛上关于此主题的帖子:https://devnet.jetbrains.com/thread/475540 https://devnet.jetbrains.com/thread/475540
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)