gpt4 book ai didi

reflection - Kotlin 类平等失败

转载 作者:IT老高 更新时间:2023-10-28 13:45:42 26 4
gpt4 key购买 nike

以下代码段显示了测试从不同来源获得的 Kotlin KClass 引用的相等性的结果。它们的字符串表示是相同的。但是他们的java类是不同的。期望 cc0c1 相等。但由于某种原因,他们不是。

是有细微差别还是错误?如果它不是错误,那么测试 KClasses 相等性的可靠方法是什么?

fun main(args: Array<String>) {
val c = Int::class
fun test(v0: Any, v1: Any) {
val c0 = v0.javaClass.kotlin
val c1 = v1.javaClass.kotlin
println("c= $c; c0= $c0; c1= $c1") // c= class kotlin.Int; c0= class kotlin.Int; c1= class kotlin.Int
println("c= ${c.java}; c0= ${c0.java}; c1= ${c1.java}") // c= int; c0= class java.lang.Integer; c1= class java.lang.Integer
println("c = c0? ${c == c0}; c0 = c1? ${c1 == c0}") // c = c0? false; c0 = c1? true
}
test(11, 22)
}

编辑:

解决方法是使用KClass.javaObjectType 方法。

文档说:

Returns a Java Class instance corresponding to the given KClass instance. In case of primitive types it returns corresponding wrapper classes.

c.javaObjectType == c1.javaObjectType 为真

但这并不能说明为什么具有相同字符串表示的 KClasses 是不同的。至少它是令人困惑的。最好在文档中说明这一点。

最佳答案

在您的情况下,相等性失败,因为当 KClasses 对应于相同的 Java 类型而不是相同的 Kotlin 类型时,它们被认为是相等的。这对于 intjava.lang.Integer 是错误的。

解决方法是使用 KClassjavaObjectType 属性,即使 Kotlin 类型编译成 Java 的原始类型,它也会返回 Java 类(不是原始类型):

 fun sameClass(c1: KClass<*>, c2: KClass<*>) = c1.javaObjectType == c2.javaObjectType

sameClass(Int::class, (1 as Any?)!!.javaClass.kotlin) //true

我同意这种语义相当困惑,我 filed an issue关于它。

另外,KClass 并不反射(reflect) Kotlin 类型的可空性,如果您需要精确地使用声明的 Kotlin 类型,则需要使用 KType,确实如此。


UPD:该问题已被标记为已修复,并且自 1.0.2 起在 KClass.equals KDoc 中解释了相等性。

关于reflection - Kotlin 类平等失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095418/

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