整数ロング
^ ^
| | | | 自動ボクシング/自動アンボクシング
| | | |
vv
int -----------------------> long
プリミティブプロモーション
このスキーマは、 Java がさまざまなものの間で実行できる暗黙的な変換を示しています。
Java では、オブジェクトとプリミティブは残念ながら別物であり、同じものではありませんLong
。からへlong
の暗黙的な変換は、 auto-boxingと呼ばれます。からへの暗黙的な変換は、 auto-unboxingと呼ばれます。この種の変換については、Java 言語仕様のセクション 5.1.8 で説明されています。long
Long
Long
long
また、他の多くの言語と同様に、Java には数値型間の暗黙的な変換があります。Anは、他の を含む式で使用される場合、int
暗黙的に a に昇格されます。これらのプロモーションが発生するコンテキストについては、Java 言語仕様のセクション 5.6 で説明されています。long
long
1
Javaのリテラルには 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
==