0

私のコードでは正しい結果が得られず、トラブルシューティングを開始して奇妙なエラーを発見しました。誰かがこれを説明してくれませんか?

フィールドをピックアップしてこれを行うと、result1 == false および result2 == true になります。なぜですか?

        MyClass m1 = new MyClass();
        MyClass m2 = new MyClass();

        Field[] fieldsFirst = m1.getClass().getDeclaredFields();
        Field[] fieldsSecond =  m2.getClass().getDeclaredFields();

        for (int i = 0; i < fieldsFirst.length; i++) {

            Field first = fieldsFirst[i];
            Field second = fieldsSecond[i];

            first.setAccessible(true);
            second.setAccessible(true);

            if(first.get(m1) instanceof Boolean)
            {
               boolean b1 = (Boolean)first.get(m1); 
               boolean b2 = (Boolean)second.get(m2);

               //Here are the results
               boolean result1 = b1 != b2; // false
               boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2); // true

            }

私が持っている場合:

public class MyClass {

private boolean myBoolean = true;

public boolean getMyBoolean()
{
return myBoolean;
}
public void setMyBoolean(booelan inBool)
{
myBoolean = inBool;
}

}
4

3 に答える 3

2

Booleanプリミティブ のラッパーbooleanです。

ラッパー クラスはデータ型をラップ (囲み) し、オブジェクトの外観を与えます。データ型がオブジェクトとして必要な場合はいつでも、このオブジェクトを使用できます。ラッパー クラスには、オブジェクトをアンラップしてデータ型を返すメソッドが含まれています。

ソース: http://way2java.com/java-lang/wrapper-classes/

他のオブジェクトと同様に、それらの値を比較する必要がある場合.equals()は、比較演算子ではなく使用する必要があります。

ここ:

boolean b1 = (Boolean)first.get(m1); 
boolean b2 = (Boolean)second.get(m2);  

を に変換しBooleanていbooleanます。unboxing conversionこれはの一部であると呼ばれAutoBoxing Conversionsます。これらが呼び出されるのはAuto、Java が自動的にその変換を行うためです。キャストを外しても。
したがって、それらのプリミティブ値を比較しています。
プリミティブ値が同じであるため、比較は true と評価されます。したがって、false

ここ:

boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2);  

2 つのオブジェクトの参照を比較しています。それらは異なるメモリ位置に格納されているため、比較の結果はtrue. 直感的ですね。別のオブジェクト、別のメモリ位置? .

2 つのオブジェクトの値を比較する必要がある場合は、equals()メソッドを使用してください。ただし、オブジェクトの場合はWrapper、目を閉じて、それらをプリミティブ値にアンボックスしてから比較してください。

Josh Bloch が「Effective Java: Comparing Wrappers?」で示唆しているように。吸盤を開梱!!
効果的なJavaからさらに、比較演算子Wrapperは、大なり記号または小なり記号が添付されている場合、クラスの場合に機能します。<<=>>=箱から出さなくても正しい結果が得られます。==正しい結果が得られ!=ない

于 2013-10-21T14:45:15.397 に答える