私が理解していることから、long
またはが2つある場合int
、値の等価性をテストする==
演算子は、オートボクシングが原因で機能しないことがあります。
==
プリミティブを扱う際に考えられるすべてのシナリオで機能するようにするには、どうすればよいですか?
私が理解していることから、long
またはが2つある場合int
、値の等価性をテストする==
演算子は、オートボクシングが原因で機能しないことがあります。
==
プリミティブを扱う際に考えられるすべてのシナリオで機能するようにするには、どうすればよいですか?
下位互換性が要求されます (そして JLS も同意します)。
double a = ..
double b = ...
if (a == b) // condition
この条件は、自動ボクシング後と同様に、自動ボクシング前と同じように機能する必要があります。つまり、オートボクシングはここでは適用できませんし、適用してはなりません。
実際、代わりにボックス化解除を使用できる場合、オートボックス化は == 式をコンパイルするために使用されることはありません。
Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true
この場合、ボックス化よりもボックス化解除が選択されます。
JLS (§15.21.1) は次のように述べています。
等価演算子のオペランドが両方とも数値型である場合、または一方が数値型で他方が数値型に変換可能 (§5.1.8) である場合、オペランドに対してバイナリ数値昇格が実行されます (§5.6.2)。
バイナリ数値プロモーションは、値セットの変換 (§5.1.13) を実行し、ボックス化解除の変換 (§5.1.8) を実行する場合があることに注意してください。
したがって、説明した問題は、両方のオペランドがボックス化された型 ( Double
、Integer
など) である場合にのみ発生します。オペランドの型がボックス化されているかどうかは、オペランドの宣言方法によって異なります。変数、フィールド、またはパラメーターの場合は、名前の宣言に使用される型によって異なります。メソッド呼び出しの場合は、メソッドが宣言されたときに使用される戻り値の型に依存します。のような他の操作の結果である場合+
は、すでにボックス化されていないはずです。タイプキャストが適用されている場合、キャストはタイプが何であるかを教えてくれます。
他の人が言ったように、==
丸め誤差のため、通常は double または float を比較するために使用しないでください。
Fafaik は、2 つのプリミティブでボクシングを取得できません。ボクシングは、(たとえば) and int
and an Integer
、または a double
and aを取るときに発生しますDouble
。ボックスを解除して「ボックス」(同等のオブジェクト) からプリミティブを取得し、2 つのプリミティブを==
演算子と比較します。この場合、それらが同じであるという保証はありません。ただし、が 2 つある場合double
は、この問題は発生しません。