通用集合允许相同类型的对象,因此在覆盖相等方法时,我们是否需要使用getClass
来检查相同类型的对象。
我的问题是(obj.getClass()!=this.getClass())
我们是否需要在类的相同方法中使用此代码,该方法在集合中用作通用类型。
我们知道Generic类型集合,我们只能添加相同类型的对象。所以,如果我从同等方法中删除此代码,那么它是否会产生任何问题。
中的新重写等值方法
@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;
}
我的问题是,如果我们在泛型Collection中使用这个类,我们需要使用相同方法的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;
}
}
答案 0 :(得分:3)
equals
必须具有反身性,对称,传递性,一致性,并为false
返回null
。
obj instanceof Student
的问题是对称性。假设您有一些MasterStudent extends Student
并遵循“instanceof CurrentClass
模式并比较CurrentClass的字段” - 就像它在Student中实现一样。在这种情况下,您可以轻松获得student.equals(masterStudent) == true
和masterStudent.equals(student) == false
。
您已修改了问题并删除了此部分:
泛型集合允许相同类型的对象,因此在覆盖相等方法时,我们是否需要使用instanceof或getClass来检查子类或相同类型的对象。
现在你基本上只是问你是否必须检查equals
中的课程,建议该类型将保证该类型。
简短回答当然你应该检查equals
中的班级。无论可能的用法如何,都应该实施equals
。
答案 1 :(得分:2)
同意Khelwood提供的评论,我们正在使用&&
条件验证并使用空检查它可以是||
,因为如果obj
为null则会导致NullpointerException
if(obj == null || (obj.getClass()!=this.getClass())){
return false;
}
答案 2 :(得分:0)
@khelwood很严谨。并在你的代码中&#34;如果&#34;是错的:
if(obj == null && (obj.getClass()!=this.getClass())){
return false;
}
它会做什么:如果obj为null,你将在下一个obj.getClass()获得NPE。 null没有类。 : - )
if (!(obj instanceof Student)) { return false;}
就够了。 null不是任何类的实例。