まず、Javaで次のような式を考えてみましょう。
Integer temp = new Integer(1);
System.out.println(temp.equals(1));
if(temp.equals(1))
{
System.out.println("The if block executed.");
}
これらすべての文は問題なく動作します。疑問の余地はありません。式 temp.equals(1)
は予想通り true
と評価され、結果として if
ブロック内の唯一のステートメントが実行されます。
ここで、データ型を Integer
から Long
に変更すると、以下のように temp1.equals(1)
という式は予想に反して false
と評価されます。
Long temp1 = new Long(1);
System.out.println(temp1.equals(1));
if(temp1.equals(1))
{
System.out.println("The if block executed.");
}
これらは、先のスニペットで述べた文と同等ですが、データ型が変更されただけで、動作は正反対です。
式 temp1.equals(1)
は false
と評価され、結果として if
ブロック内の唯一のステートメントは実行されず、前のステートメントと逆の動作になります。どのように?
Longと
intを比較しているのですね。 java.lang.Long#equals
]1 の javadoc には、 equals
メソッドは次のように記述されています。
このオブジェクトと指定されたオブジェクトを比較します。結果は、引数が NULL ではなく、このオブジェクトと同じ long 値を含む Long オブジェクトである場合にのみ、真となります。
代わりに System.out.println(new Long(1).equals(1L));
Longと
Integerの比較ではなく、
Longと
Longの比較をしているので、
true` と表示されます。