5

デフォルトでは、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ではありませんLongNumberただし、true を返すのと同じ方法で true を返すサブクラスの「等しい値」は存在し100 == 100Lますか? それとも100d == 100L?言い換えれば、Object.equalsオブジェクトの Binary Numeric Promotion 動作と同等の動作を行うメソッド (ではない) はありますか?

4

3 に答える 3

2

Guavaは、各タイプの compare() メソッドを含む、プリミティブを操作するためのいくつかの優れたユーティリティを提供します。

int compare(prim a, prim b)

実際、これと同じ機能が Java 7 の JDK に追加されました。これらのメソッドは任意Numberの比較を提供しませんが、どのクラス ( LongsDoublesなど) を使用します。

@Test
public void valueEquals() {
  // Your examples:
  assertTrue(100 == 100l);
  assertTrue(100d == 100l);
  assertNotEquals(100, 100l); // assertEquals autoboxes primitives
  assertNotEquals(new Integer(100), new Long(100));

  // Guava
  assertTrue(Longs.compare(100, 100l) == 0);
  assertTrue(Longs.compare(new Integer(100), new Long(100)) == 0);
  assertTrue(Doubles.compare(100d, 100l) == 0);
  // Illegal, expected compare(int, int)
  //Ints.compare(10, 10l);

  // JDK
  assertTrue(Long.compare(100, 100l) == 0);
  assertTrue(Long.compare(new Integer(100), new Long(100)) == 0);
  assertTrue(Double.compare(100d, 100l) == 0);
  // Illegal, expected compare(int, int)
  //Integer.compare(10, 10l);
  // Illegal, expected compareTo(Long) which cannot be autoboxed from int
  //new Long(100).compareTo(100);
}
于 2013-10-16T20:49:30.220 に答える