我试图从泛型类型中调用'equals'方法。在运行时,类型具有'equals'的重载但仍然触发Object.equals(Object obj)。
这是称为'equals'的泛型类。
public class SortedGroup <T> {
void func(T element1,T element2) {
if (element1.equals(element2))
System.out.println("yes");
else
System.out.println("no");
}
这是重载'equals'的新类型类
public class Person {
private int ID;
public Person(int ID) {
this.ID = ID;
}
...
public boolean equals(Person o) {
return (this.ID == o.ID);
}
...
}
这是主要的。
Person p1 = new Person(1);
Person p2 = new Person(1);
SortedGroup<Person> SG = new SortedGroup<Person>();
SG.func(p1,p2);
}
我希望输出是yes
但实际输出no
你没有覆盖equals
,你正在重载它(相同的方法名称,不同的签名)。要正确覆盖equals
中的Object
,必须匹配方法签名。这意味着你的equals
方法必须采用Object
,而不是Person
。
public boolean equals(Object o) { // ...
优良作法是将@Override
注释包含在任何旨在从超类覆盖方法或从接口实现方法的方法上。如果您已经这样做了,那么编译器会提醒您事实上您的方法没有覆盖equals
。
@Override
public boolean equals(Object o) { // ...
这也意味着您需要在投射和比较成员值之前测试传入的对象是否实际上是Person
。
根据hashCode
,覆盖equals
以便与hashCode
contract一致也是一种好习惯。