次のスニペットは、さまざまなソースから入手したKotlin KClass
参照の等価性をテストした結果を示しています。それらの文字列の表現は同じです。しかし、彼らのJavaクラスは異なっています。 c
,c0
およびc1
が等しいと予想される。しかし何らかの理由で彼らはそうではありません。Kotlinクラスの等価性が失敗する
ニュアンスがありますかバグですか?それがバグでなければ、KClass
の等価性をテストする信頼できる方法は何ですか?
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)
}
EDIT:
回避策はKClass.javaObjectType
方法を使用することです。
ドキュメントは言う:
与えKClassインスタンスに対応するJavaクラスのインスタンスを返します。プリミティブ型の場合、対応するラッパークラスを返します。
e.e.e. c.javaObjectType == c1.javaObjectType
が真である
しかし、同じ文字列表現を持つKClass
が異なる理由は正当ではありません。少なくともそれは混乱しています。そして、それについてドキュメントに書いておくことをお勧めします。
null許容度はクラスの比較に関連していますか?私が理解しているように、クラスはnull可能ではありません。式の型は可能です。しかし、私たちはクラスの平等をテストしますが、表現はテストしません。 –
@ MarkusMarvell、あなたは正しいです、そうではありません。私は、「KClass」はKotlinの型を宣言していないことを別のことのヒントとして述べている。私はそれをもっと明確にするために、この声明を改革するつもりです。 – hotkey