2017-04-12 58 views
-2

在我的IDE(eclipse neon)上运行jre 1.8。正如你在下面的代码片段中看到的,我开发了My Custom类来覆盖equals方法。这是因为我想使用我的覆盖版本,当我从我的自定义类的集执行removeAll方法。Java 1.8覆盖equals()未被Collection调用removeAll()

查看jdk源代码的内部,可以验证removeAll方法是否使用contains方法,该方法又使用Object类的equals方法。

public class MyClass { 
    private String connectionID; 


    public MyClass(){  
    ... 
    } 


    @Override 
    public boolean equals(Object obj) {  
     if (obj instanceof MyClass){ 
      if (((MyClass)obj).getConnectionID().equalsIgnoreCase(this.getConnectionID())){ 
       return true; 
      } 
     } 
     return false; 
    } 
... 
} 



public class MyClassContainer{ 

    private Set<MyClass> classes = new HashSet<>(); 

    public Set<MyClass> getClasses() { 
     return this.classes ; 
    } 

} 

public class Main(){ 

    private void method(MyClassContainer contClass) { 

    if (true){ 
     Set<MyClass> temp = some valid Set;   
     temp.removeAll(contClass.getClasses()); 
    } 

} 

启动此代码我意识到重写的equals方法永远不会被调用。

这是什么错误?

感谢

+1

您正在使用什么样的一整套实施?请注意,如果您覆盖equals,则应该重写hashCode以保持一致。这可能是你的问题。 –

+1

可能的重复[为什么我需要重写Java中的equals和hashCode方法?](http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and -hashcode-methods-in-java) –

回答

0

才能正常工作,你需要重写hashCode还有:

@Override 
public int hashCode() { 
    return Objects.hash(getConnectionID()); 
} 
+0

*注意!*如果使用equalsIgnoreCase实现了相等性,那么哈希代码也必须不区分大小写,这个实现不提供。虽然,在这种情况下,很可能ID对比实际上不应区分大小写。所以'equals'的实现可以被修正并简化为'return(obj instanceof MyClass)&&((MyClass)obj).getConnectionID()。equals(this.getConnectionID()));'... – Holger