equals方法覆盖超类中的equals,可能不是对称的

Sri*_*san 3 java

对于我的"平等"方法,我有以下Findbugs错误,

此类定义一个equals方法,该方法覆盖超类中的equals方法.两个equals方法方法在确定两个对象是否相等时使用instanceof.这充满了危险,因为重要的是equals方法是对称的(换句话说,a.equals(b)== b.equals(a)).如果B是A的一个子类型,并且所述参数是一个instanceof A,以及B的equals方法检查该参数是一个instanceof B A的等于方法检查,这是很可能的是通过这些方法定义的等价关系是不对称的.

我无法在此处发布代码以进行安全违规.请告诉我这是什么错误?

SJu*_*n76 12

它说合同equals()暗示,a.equals(b)当且仅当b.equals(a)是真的时,这是真的.

如果B延伸A,A.equals(Object obj)你可能会有

if !(obj instanceof A) return false;
Run Code Online (Sandbox Code Playgroud)

B.equals(Object obj)您将有

if !(obj instanceof B) return false;
Run Code Online (Sandbox Code Playgroud)

这是不对称:B的make(b instanceof A)实例为true,而A的实例为(a instanceof B)false.所以它意味着风险而不是a.equals(b)真实而且b.equals(a)是错误的.


Ily*_*lya 5

您可以使用类似的构造来防止此错误:

public boolean equals(final Object obj)
{
   if (obj == null || getClass() != obj.getClass())
   {
      return false;
   } 
// ... 
Run Code Online (Sandbox Code Playgroud)

代替

public boolean equals(final Object obj)
{
   if (!(o instanceof UniversalIDDefinition))
   {
      return false;
   }   
// ...
Run Code Online (Sandbox Code Playgroud)