首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java、overriding和equals

java、overriding和equals
EN

Stack Overflow用户
提问于 2014-01-21 17:53:44
回答 3查看 140关注 0票数 0

好吧,这真的是一个简单的问题,但是我不能理解为什么我的代码不能正常工作。

在我正在使用的第三部分库中,在某个点上完成了类似这样的操作:

代码语言:javascript
运行
复制
Object value = someValue;
Object compareValue = someOtherValue;
if(value.equals(compareValue)) 
 // do something

现在,我的对象是同一个类的实例,它的覆盖等同于下面的契约:

代码语言:javascript
运行
复制
 @Override
public boolean equals(Object obj) {

不管怎样,jvm调用object类定义的equals,这给了我一个不想要的行为。我该如何解决这个问题呢?我重复一遍,调用代码是一个不能修改的外部库。

编辑:这是我的类的完整代码:

代码语言:javascript
运行
复制
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,因为我使用了调试器...我使用的equals实现是由netbeans生成的。

EN

回答 3

Stack Overflow用户

发布于 2014-01-21 22:06:38

这是一个建筑问题。maven和netbeans的复杂组合出现了一些小故障。这意味着我调试的代码是一个过时的版本,不包含equals方法。

很抱歉浪费了你的时间。

票数 1
EN

Stack Overflow用户

发布于 2014-01-21 17:58:52

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

代码语言:javascript
运行
复制
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;
    }
票数 0
EN

Stack Overflow用户

发布于 2014-01-21 17:59:45

无论如何,

jvm调用由object类定义的equals

您如何知道名为equals的JVM是由object类定义的?

假设调用的是Object.eqauls:即使您已经覆盖了equals方法,由集成开发环境提供的默认实现(比如eclipse )也会在内部调用超类equals()方法,在本例中可以是Object.eqauls

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

代码语言:javascript
运行
复制
@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    return super.equals(obj);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21254633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档