web-dev-qa-db-ja.com

Kotlinの興味深い演算子 '==='

Kotlinで「===」演算子は何をしますか?それはどのように機能しますか?参照の同等性を確認できますか?

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

しかし場合:

var a : Int = 1000
var b : Int = 1000
println(a === b) // print 'true' !!!

val a: Int = 1000およびval b: Int = 1000は範囲内にありません-128..127、 それでも === trueまたはコンパイラーは、1つの値を取ることができることを理解している場合がありますか?

24
NiceTheo

文書化 として、それは参照平等を表します:

参照の同等性は、===操作(およびその否定された対応物!==)によってチェックされます。 a === bは、aとbが同じオブジェクトを指している場合にのみ、trueと評価されます。

参照の同等性とは、2つの参照が同じオブジェクトを指していることを意味します。インスタンスごと:

fun main(args: Array<String>) {
    val number1 = Integer(10) // create new instance
    val number2 = Integer(10) // create new instance
    val number3 = number1

    // check if number1 and number2 are Structural equality
    println(number1 == number2) // prints true

    // check if number1 and number2 points to the same object
    // in other words, checks for Referential equality
    println(number1 === number2) // prints false

    // check if number1 and number3 points to the same object
    println(number1 === number3) // prints true
}

これを以下のJavaコード)と比較してください。

public static void main(String[] args) {
    Integer number1 = new Integer(10); // create new instance
    Integer number2 = new Integer(10); // create new instance
    Integer number3 = number1;

    // check if number1 and number2 are Structural equality
    System.out.println(number1.equals(number2)); // prints true

    // check if number1 and number2 points to the same object
    // in other words, checks for Referential equality
    System.out.println(number1 == number2); // prints false

    // check if number1 and number3 points to the same object
    System.out.println(number1 == number3); // prints true
}

あなたの例:

また、 ここに記載 のように、「番号のボックス化はIDを保持しません」。したがって、boxedAには1つのIDがありますが、anotherBoxedAには別のIDがあります。どちらも構造的に同等ですが、参照上の同等ではありません。

しかし、なぜ2番目のものが機能するのでしょうか。 Kotlin Int型はJava int型に対応するためです。2番目の例で比較される2つの変数は、オブジェクトではなくプリミティブ型の値です。したがって、それらの参照の等式は、通常の等式とまったく同じです。

36
marcospereira