假设,我有一个班级,称之为学生.student类有一个元素,一个名为Id的int.我想覆盖equals,因此如果将Student与Integer进行比较,则该方法返回true.喜欢:
public class OverrideTest {
public static void main(String[] args) {
Student a = new Student();
a.setId(5);
System.out.println(a.equals(5));
}
public static class Student {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (o instanceof Student) {
Student a = (Student) o;
if (a.getId() == this.getId())
return true;
}
if (o == this)
return true;
if (o instanceof Integer) {
int id = (Integer) o;
if (id == this.getId())
return true;
}
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉IDE这是可以的,不需要发送警告?
返回true,但在IDE中出现语法警告.
正如Yshavit所指出的那样,虽然你可以做你想做的事情,但这是非常危险的,因为它打破了.equals(...)关系的对称性.例如,考虑:
Student s = new Student(5);
Integer i = new Integer(5);
if(s.equals(i)) System.out.println("s equals i");
else System.out.println("s doesnt equal i");
if(i.equals(s)) System.out.println("i equals s");
else System.out.println("i doesnt equal s");
Run Code Online (Sandbox Code Playgroud)
输出:
s equals i
i doesnt equal s
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,这没有任何意义.可能有一种方法可以说服你的IDE忽略这里的警告,但你几乎肯定应该注意它,而不是让学生能够等于整数.
equals(..)方法在容器内部使用HashSets,因此这种方法会导致内置结构中出现不稳定的行为.