ジェネリックコレクションでは、同じタイプのオブジェクトを使用できます。したがって、等しいメソッドをオーバーライドする場合は、同じタイプのオブジェクトをチェックするためにgetClass
を使用する必要があります。ジェネリック型コレクションでは、オーバーライドされた等価メソッドでgetClassをチェックする必要がありますか?
私の質問は(obj.getClass()!=this.getClass())
です。このコードは、コレクションの汎用タイプとして使用されるクラスと同じメソッドで必要ですか。 私たちは汎用型のコレクションを知っている、我々はは同じ種類のオブジェクトを追加することができます。したがって、等価メソッドからこのコードを削除すると、問題はありますか?
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
if(this == obj){
return true;
}
Student std = (Student)obj;
return name.equals(std.name) && rollNum == std.rollNum;
}
の新オーバーライド同じ方法で、我々は一般的なコレクションでこのクラスを使用している場合、私の質問は、我々は同じ方法で使用するのはgetClass()を必要とするんですが、私は、そのコード行が関連はないと思います一般的なオブジェクトの追加異なるタイプに許可されませんので、
import java.util.*;
public class HashSetDemo {
public static void main(String [] args){
HashSet<Student> hashSet = new HashSet<Student>();
hashSet.clear();
Student std1 = new Student(11, "qaa");
Student std2 = new Student(21, "aa");
Student std3 = new Student(31, "saa");
Student std4 = new Student(51, "aad");
Student std5 = new Student(71, "aad");
hashSet.add(std1);
hashSet.add(std2);
hashSet.add(std3);
hashSet.add(std4);
hashSet.add(std5);
}
}
class Student{
int rollNum;
String name;
public Student(int rollNum, String name){
this.rollNum = rollNum;
this.name = name;
}
@Override
public int hashCode() {
//some code
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj == null || (obj.getClass()!=this.getClass())){
return false;
}
Student std = (Student)obj;
return name.equals(std.name) && rollNum == std.rollNum;
}
}
「Student」のサブクラスを持ち、そのサブクラスのインスタンスをベースクラスのインスタンスと同じにするには、 'instanceof'を使用します。そうでなければ、 'getClass()'を使用します。これは、誤って非対称な 'equals'メソッドで終わってしまうのを防ぐためです(例えば、[java.sql.Timestamp](https://docs.oracle.com/javase/7/docs/api/ java/sql/Timestamp.html#equals(java.lang.Object)))。あなたが一般的なコレクションに入れているという事実は、実際問題ではありません。 – khelwood
あなたの質問が「タイプを一切チェックすべきか? '' equals'メソッドが['equals']の通常の規約に従う必要があるためです(https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java .lang.Object))、これは他の型のオブジェクトを与えるとfalseを返します( 'ClassCastException'をスローしません)。 – khelwood
@khelwoodコメントありがとうございました。私はinstanceof演算子を削除しました。今、答えを教えてください。 – Guest