平等は対称的であるべきですよね?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
2 番目の形式で をスローしない理由は何NullPointerException
ですか?
平等は対称的であるべきですよね?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
2 番目の形式で をスローしない理由は何NullPointerException
ですか?
最初のケースでは、equals() メソッドは NPE をスローしないため、その引数を作成できません。対称性は equals() メソッドの契約の一部です。
平等は確かに理論的な意味で対称であると定義されていますが、存在しないオブジェクト(nullが表すもの)ではまったく定義されていません。
したがって、nullに適用された場合の動作も同様に有効です。それは生きているウサギを返す可能性がありますが、それでも平等の理論的定義と矛盾することはありません。
このような場合、Javaの設計者に代わって、null値でequalsを呼び出すことは、null値で他のメソッドを呼び出すことと一致するため、NullPointerExceptionをスローすることはかなり合理的な実装決定です。
null
2 番目のケースでは、オブジェクトのメソッドにアクセスしていないためです。バランスが取れていないのは平等の概念ではなく、平等にアクセスする方法です。
2番目の例は、Objectおよびequals()メソッドに関する単純なルールの1つに違反しているため、対称性の例ではありません。
null以外の参照値xの場合、x.equals(null)はfalseを返す必要があります。
私は行きます
someObject.equals(null);
2 番目のフォームで NullPointerException をスローしない理由は何ですか?
この場合、NullPointerException はスローされません。
ここで、 が呼び出されるオブジェクトが であることは確かequals()
ですNOT NULL
。
null ポインターを逆参照していないため、2 番目のビットは NPE をスローしません。値を非値と比較しているため、このコードは false を返します。
equals(null)
null 値などはないため、常に false を返します。null
Javaには概念が存在しないため、 オブジェクトもプリミティブも値を持つことはできません。null
などの参照を比較する理由は、null 参照を表すリテラルですif (obj == null)
。Java 言語仕様のセクション 3.10.7を参照してください。つまり、値をsomeObject
null 参照と比較しています。
独自のオブジェクトを作成し、オーバーライドequals
して true を返すこともできますが、それは Object の定義に反します。