デフォルトでは、Java はプリミティブに対してBinary Numeric Promotionを行いますが、オブジェクトに対しては同じことを行いません。デモ用の簡単なテストを次に示します。
public static void main(String... args) {
if(100 == 100L) System.out.println("first trial happened");
if(Integer.valueOf(100).equals(Long.valueOf(100))) {
System.out.println("second trial was true");
} else {
System.out.println("second trial was false");
}
if(100D == 100L) System.out.println("third trial, fun with doubles");
}
出力:
first trial happened
second trial was false
third trial, fun with doubles
これは明らかに正しい動作です。 anInteger
はaではありませんLong
。Number
ただし、true を返すのと同じ方法で true を返すサブクラスの「等しい値」は存在し100 == 100L
ますか? それとも100d == 100L
?言い換えれば、Object.equals
オブジェクトの Binary Numeric Promotion 動作と同等の動作を行うメソッド (ではない) はありますか?