整数ロング
^ ^
| | | | 自動ボクシング/自動アンボクシング
| | | |
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あり-1、intです。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==