Reflection Kotlin类相等失败

Reflection Kotlin类相等失败,reflection,kotlin,Reflection,Kotlin,下面的代码片段显示了测试从不同来源获得的KotlinKClass引用的相等性的结果。它们的字符串表示形式相同。但是它们的java类是不同的。预计c,c0和c1相等。但由于某些原因,它们不是 是有细微差别还是有缺陷?如果不是bug,那么测试KClasses的相等性的可靠方法是什么 fun main(args: Array<String>) { val c = Int::class fun test(v0: Any, v1: Any) { val c0 =

下面的代码片段显示了测试从不同来源获得的Kotlin
KClass
引用的相等性的结果。它们的字符串表示形式相同。但是它们的java类是不同的。预计
c
c0
c1
相等。但由于某些原因,它们不是

是有细微差别还是有缺陷?如果不是bug,那么测试
KClass
es的相等性的可靠方法是什么

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)
}
fun main(args:Array){
val c=Int::class
乐趣测试(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
}
测试(11,22)
}

编辑:

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

文件说:

返回与给定KClass实例对应的Java类实例。对于基元类型,它返回相应的包装器类

也就是说,
c.javaObjectType==c1.javaObjectType
为真


但它不能解释为什么具有相同字符串表示的
KClass
es不同。至少让人困惑。在文档中注意这一点是个好主意。

在您的例子中,相等失败是因为
KClass
e对应于相同的Java类型,而不是相同的Kotlin类型时,它们被认为是相等的。这对于
int
java.lang.Integer
是错误的

解决方法是使用
KClass
javaObjectType
属性,即使对于编译成Java原语的Kotlin类型,该属性也将返回Java类(而不是原语类型):

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

 sameClass(Int::class, (1 as Any?)!!.javaClass.kotlin) //true
fun sameClass(c1:KClass,c2:KClass)=c1.javaObjectType==c2.javaObjectType
sameClass(Int::class,(1作为任何?)!!.javaClass.kotlin)//true
我同意这个语义学是相当混乱的,我对此感到困惑

另外,
KClass
并不反映Kotlin类型的可空性,如果您需要精确地处理已声明的Kotlin类型,您将需要使用
KType
,它确实反映了这一点



UPD:该问题已被标记为已修复,等式在
KClass中解释。自1.0.2以来等于
KDoc。

可空性与类比较有关吗?据我所知,类不能为null。表达式类型可以。但我们测试的是类的相等性,而不是表达式的相等性。@MarkusMarvell,你是对的,不是。我指出这只是对另一件事的一个提示,
KClass
没有来自声明的Kotlin类型。我将重新起草这份声明,使之更清楚。