私の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メソッドが呼び出されないことがわかります。
何が間違っていますか?それが正しく機能するためには
おかげ
? equalsをオーバーライドする場合、一貫性を保つためにhashCodeもオーバーライドする必要があることに注意してください。これはおそらくあなたの問題です。 –
[なぜJavaでequalsメソッドとhashCodeメソッドをオーバーライドする必要がありますか?](http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and) -hashcode-methods-in-java) –