为泛型调用重载方法 'equals'
Call the overload method 'equals' for a generic type
我正在尝试从通用类型调用 'equals' 方法。
在 运行 时间类型有 'equals' 的重载
但是 Object.equals(Object obj) 仍然被触发。
这是调用 'equals' 的通用 class。
public class SortedGroup <T> {
void func(T element1,T element2) {
if (element1.equals(element2))
System.out.println("yes");
else
System.out.println("no");
}
这是重载 'equals'
的新类型 class
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
,您正在 重载 它(相同的方法名称,不同的签名)。要正确地从 Object
覆盖 equals
,您必须匹配方法签名。这意味着您的 equals
方法必须采用 Object
,而不是 Person
.
public boolean equals(Object o) { // ...
最好在任何旨在重写超类中的方法或实现接口中的方法的方法上包含 @Override
注释。如果您这样做了,那么编译器会提醒您您的方法没有覆盖 equals
.
@Override
public boolean equals(Object o) { // ...
这也意味着您需要在转换和比较成员值之前测试传入的对象是否实际上是 Person
。
,覆盖 hashCode
使其与 equals
一致也是一种很好的做法
我正在尝试从通用类型调用 'equals' 方法。 在 运行 时间类型有 'equals' 的重载 但是 Object.equals(Object obj) 仍然被触发。
这是调用 'equals' 的通用 class。
public class SortedGroup <T> {
void func(T element1,T element2) {
if (element1.equals(element2))
System.out.println("yes");
else
System.out.println("no");
}
这是重载 'equals'
的新类型 classpublic 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
,您正在 重载 它(相同的方法名称,不同的签名)。要正确地从 Object
覆盖 equals
,您必须匹配方法签名。这意味着您的 equals
方法必须采用 Object
,而不是 Person
.
public boolean equals(Object o) { // ...
最好在任何旨在重写超类中的方法或实现接口中的方法的方法上包含 @Override
注释。如果您这样做了,那么编译器会提醒您您的方法没有覆盖 equals
.
@Override
public boolean equals(Object o) { // ...
这也意味着您需要在转换和比较成员值之前测试传入的对象是否实际上是 Person
。
hashCode
使其与 equals
一致也是一种很好的做法