Jir*_*ire 5 java reflection kotlin
我有地图KClass来Int.然后我有一个具有统一通用类型的函数.因此,我希望以下情况能够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
我相信您的 Map 中的关键类型是KClass原始类型(Java int 而不是 Integer)的实例。函数中的具体化类型是KClass装箱类型 (Integer) 的实例,如Kotlin 的具体化类型对于 JVM 上的原语是否不正确?
虽然这两个KClasss 打印为同一事物,但它们不相等,因此您的查找失败。
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |