3

簡単な条件を書いていた

List<Long> path = doSomething(); // returns a list of Long and all equal to -1
if (path.get(0)==-1)
    sysout("first condition works"); // never executes
if (path.get(0).equals(-1))
    sysout("sec condition works");  //never executes
if (path.get(0).equals(new Long(-1)))  
    sysout("third condition works");  //works!

それはなぜですか?詳細については、公式ドキュメント ファイルの記事を参照してください。

4

6 に答える 6

9
整数ロング
  ^ ^
  | | | | 自動ボクシング/自動アンボクシング
  | | | |
  vv
 int -----------------------> long

      プリミティブプロモーション

このスキーマは、 Java がさまざまなものの間で実行できる暗黙的な変換を示しています。

Java では、オブジェクトとプリミティブは残念ながら別物であり、同じものではありませんLong。からへlongの暗黙的な変換は、 auto-boxingと呼ばれます。からへの暗黙的な変換は、 auto-unboxingと呼ばれます。この種の変換については、Java 言語仕様のセクション 5.1.8 で説明されています。longLongLonglong

また、他の多くの言語と同様に、Java には数値型間の暗黙的な変換があります。Anは、他の を含む式で使用される場合、int暗黙的に a に昇格されます。これらのプロモーションが発生するコンテキストについては、Java 言語仕様のセクション 5.6 で説明されています。longlong

1Javaのリテラルには type があることに注意してくださいint。リテラル1Lには type がありlongます。

Long v = ...
if(v == -1) ...

vは でLongあり-1intです。Java は、オブジェクトとプリミティブを比較する方法を認識していません。Java は暗黙の変換規則に依存しています。ここで-1は、 に変換 (自動ボックス化) されますInteger。そのため、同じタイプでさえない 2 つのオブジェクトの参照を比較しています。テストは失敗します。

Long v = ...
if(v.equals(-1)) ...

これは上記と同じですが、暗黙の変換をトリガーするのは比較ではなく、メソッド呼び出しです。equalsは をObjectパラメーターとして受け取るため、-1に変換 (自動ボックス化) されますInteger。メソッド呼び出しによってトリガーされる暗黙的な変換については、Java 言語仕様のセクション 5.3 で説明されています。

Long v = ...
if(v.equals(new Long(-1))) ...

ここでは、パラメーターとして a を使用してLong.equalメソッドを呼び出すため、テストは成功します。Long

では、どのような比較が機能しますか?

Long v = ...
if(v.equals(-1L)) ...

-1Lですlong。を期待するメソッドに渡されるため、Object暗黙的に に変換 (自動ボックス化) されLongます。テストは成功します。

Long v = ...
if(v.longValue() == -1) ...

v.longValue()long-1ですint。は、演算子のため-1に a に昇格します。テストは成功します。long==

于 2013-11-12T13:13:53.923 に答える
3

最初の 2 つのケースは、Long と Integer を比較しており (オートボクシングのため)、それらが同じオブジェクトになることはありません (当然のことです)。

あなたの最後のケースは正しいものです。オブジェクトを比較するときは equals() を使用します。

編集: または、== 演算子を使用する場合は longValue()/intValue() などのメソッド。

于 2013-11-12T12:48:18.303 に答える
1

交換if (path.get(0).equals(-1))

if (path.get(0).equals(-1L))

デフォルトでは、数値は Java で整数として扱われるため、比較は失敗します。

理解を深めるために、Java での自動ボクシングを見てください。

于 2013-11-12T12:48:48.540 に答える
0

なぜなら、equals()期待しているからですObject。メソッドにプリミティブ値を渡すことはできませんequals()。だから、equals(-1)間違っています。

于 2013-11-12T12:48:43.660 に答える
0

使用する

  if (path.get(0).equals(-1)) //long value

または

if (path.get(0).longValue()==-1)

または

if (path.get(0)==-1L)
于 2013-11-12T12:48:47.090 に答える