2017-04-12 6 views
-2

私のIDE(Eclipseネオン)上で実行しています。以下のスニペットコードでわかるように、私は、Myalsクラスを開発して、equalsメソッドをオーバーライドしました。それは私が私のカスタムクラスのセットからremoveAllメソッドを実行するとき、私は私のオーバーライドされたバージョンを使用したいので。Java 1.8オーバーライドequals()コレクションによって呼び出されていません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

* equalsが 'equalsIgnoreCase'を使って実装されている場合、ハッシュコードは大文字と小文字を区別する必要があります。この場合、ID比較は実際には大文字と小文字を区別しないと考えられます。したがって、 'equals'の実装は' return(obj instanceof MyClass)&&((MyClass)obj).getConnectionID()。equals(this.getConnectionID())); 'に修正され単純化されます。 – Holger

関連する問題