Kotlin:Reified仿制药似乎不适合哈希/等于比较

Jir*_*ire 5 java reflection kotlin

我有地图KClassInt.然后我有一个具有统一通用类型的函数.因此,我希望以下情况能够Int与我联系Boolean::class

val kclassToInt = mapOf(Boolean::class to 1, Byte::class to 1, Short::class to 2)

inline fun <reified T> myExpectations() =
        assertEquals(1, kclassToInt.getRaw(T::class), "Why doesn't it work? :'(")
Run Code Online (Sandbox Code Playgroud)

Why doesn't it work? :'(. Expected <1>, actual <null>.打电话给它就像这样打招呼myExpectations<Boolean>().

然后我尝试使用.javaoff,所以我使用的是Java Class而不是Kotlin KClass.

val classToInt = mapOf(Boolean::class.java to 1, Byte::class.java to 1, Short::class.java to 2)

inline fun <reified T : Any> anotherExpectation() =
        assertEquals(1, classToInt.getRaw(T::class.java))
Run Code Online (Sandbox Code Playgroud)

这次我再次受到断言错误的欢迎: java.lang.AssertionError: Expected <1>, actual <null>.

最后我尝试使用.javaClass而不是.java:

val javaClassToInt = mapOf(Boolean::class.javaClass to 1, Byte::class.javaClass to 1, Short::class.javaClass to 2)

inline fun <reified T> pleaseWork() =
        assertEquals(1, javaClassToInt.getRaw(T::class.javaClass))
Run Code Online (Sandbox Code Playgroud)

这次真的很奇怪.我受到了这样的欢迎:java.lang.AssertionError: Expected <1>, actual <2>.这似乎是因为所有人都.javaClass提到了KClassImpl.

最后我采取了我不想做的事情,使用.qualifiedName:

val qnToInt = mapOf(Boolean::class.qualifiedName to 1, Byte::class.qualifiedName to 1, Short::class.qualifiedName to 2)

inline fun <reified T> iKnowItWorks() =
        assertEquals(1, qnToInt.getRaw(T::class.qualifiedName))
Run Code Online (Sandbox Code Playgroud)

这当然有用,也是我在实际使用案例中使用的:https://github.com/Jire/kotmem/blob/master/src/main/kotlin/org/jire/kotmem/Process.kt

Dun*_*gor 1

我相信您的 Map 中的关键类型是KClass原始类型(Java int 而不是 Integer)的实例。函数中的具体化类型是KClass装箱类型 (Integer) 的实例,如Kotlin 的具体化类型对于 JVM 上的原语是否不正确?

虽然这两个KClasss 打印为同一事物,但它们不相等,因此您的查找失败。