Reflection Kotlin类相等失败
下面的代码片段显示了测试从不同来源获得的KotlinReflection 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 =
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类型。我将重新起草这份声明,使之更清楚。