java,overriding和equals

时间:2014-01-21 09:53:44

标签: java equals override

确定这是一个简单的问题,但我无法理解为什么我的代码无法正常运行。

在我使用的第三部分库中,在某个时刻完成了类似的事情:

Object value = someValue;
Object compareValue = someOtherValue;
if(value.equals(compareValue)) 
 // do something

现在,我的对象是同一个类的实例,覆盖等于以下合同:

 @Override
public boolean equals(Object obj) {

jvm无论如何调用对象类定义的equals,给我一个不需要的行为。 我怎样才能解决这个问题? 我再说一遍,调用代码是一个我无法修改的外部库。

编辑:这是我班级的完整代码:

public class MissionPriorityResolutionCriteria implements ResolutionCriteria {
private Satellite prioritySatellite;

public MissionPriorityResolutionCriteria(Satellite prioritySatellite) {
    this.prioritySatellite = prioritySatellite;
}



@Override
public int hashCode() {
    int hash = 5;
    hash = 53 * hash + (this.prioritySatellite != null ? this.prioritySatellite.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final MissionPriorityResolutionCriteria other = (MissionPriorityResolutionCriteria) obj;
    if (this.prioritySatellite != other.prioritySatellite && (this.prioritySatellite == null || !this.prioritySatellite.equals(other.prioritySatellite))) {
        return false;
    }
    return true;
}

public Satellite getPrioritySatellite() {
    return prioritySatellite;
}

public void setPrioritySatellite(Satellite prioritySatellite) {
    this.prioritySatellite = prioritySatellite;
}

public boolean apply(SRASolution s) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

我知道他正在调用Object.equals因为我使用调试器... 我使用的等于实现是由netbeans生成的。

3 个答案:

答案 0 :(得分:1)

这是一个大问题。混乱的maven和netbeans发生了一些故障。这意味着我正在调试的代码是一个过时的版本,不包含equals方法。

抱歉浪费你的时间。

答案 1 :(得分:0)

覆盖equals方法并实现您自己的代码。您可以使用equals运算符实现自己的instanceof方法,实际检查实例变量的类型是否相同。这是用于比较两个字符串的代码。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
      if (anObject instanceof String) {
           String anotherString = (String)anObject;
           int n = count;
           if (n == anotherString.count) {
               char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
               int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
               return true;
            }
        }
       return false;
    }

答案 2 :(得分:0)

  

jvm无论如何都要调用对象类

定义的等号

你是怎么知道JVM调用equals定义的对象类?

假设它被称为Object.eqauls:即使你有重写的equals方法,IDE提供的默认实现(如eclipse)也在内部调用超类equals()方法,在你的情况下可以是Object.eqauls

IDE自动生成的代码如下所示:

@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    return super.equals(obj);
}

作为解决方案,请使用您自己的逻辑替换对super.equals()的调用以进行比较。