在泛型类型集合中,我们需要在overriden equal方法中检查getClass吗?

时间:2016-12-06 13:22:11

标签: java generics

通用集合允许相同类型的对象,因此在覆盖相等方法时,我们是否需要使用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;
    }
}

3 个答案:

答案 0 :(得分:3)

equals必须具有反身性,对称,传递性,一致性,并为false返回null

obj instanceof Student的问题是对称性。假设您有一些MasterStudent extends Student并遵循“instanceof CurrentClass模式并比较CurrentClass的字段” - 就像它在Student中实现一样。在这种情况下,您可以轻松获得student.equals(masterStudent) == truemasterStudent.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不是任何类的实例。