gpt4 book ai didi

java - Kotlin:具体化的泛型似乎不适用于散列/等于比较

转载 作者:搜寻专家 更新时间:2023-10-31 20:10:00 25 4
gpt4 key购买 nike

我有 KClass 的 map 至 Int .然后我有一个具有具体化泛型类型的函数。然后我会期望以下情况给我 IntBoolean::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? :'(")

迎接我的是Why doesn't it work? :'(. Expected <1>, actual <null>.从像这样的电话myExpectations<Boolean>() .

然后我尝试使用 .java关闭,所以我使用的是 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))

这次我再次遇到断言错误: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))

这次真的很奇怪。我受到了欢迎: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))

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

最佳答案

您很可能写过类似 println(type.javaClass) 的内容这似乎有道理,但实际上没有,因为它总是打印 class kotlin.reflect.jvm.internal.KClassImpl , 因为那是 KClass 的内部实现类界面。

为什么 type.javaClass那样工作? javaClass是一个扩展属性,它获取作为接收者传递给它的任何值的运行时 Java 类。它的签名是:

val <T : Any> T.javaClass: Class<T>

typeKClass<T> 类型的完全有效值, 所以 type.javaClass的结果类型是 Class<KClass<T>> .这已经几乎完全没有意义,除非你想反省 KClass 的符号。实现类。自 typeKClassImpl运行时实例,type.javaClass实际上是 Class表示名为 kotlin.reflect.jvm.internal.KClassImpl 的类的实例.

这有点令人困惑,绝对不是您想做的。如果你想在屏幕上打印一个类实例,你可以调用 println(type) .如果你想获得 Java Class KClass对应的实例例如,您可以使用 java扩展属性:type.java . java的签名是:

val <T : Any> KClass<T>.java: Class<T>

所以如果typeKClass<T> , 然后 type.javaClass<T> .

关于java - Kotlin:具体化的泛型似乎不适用于散列/等于比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33980151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com