对泛型类型调用重载方法'equals'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对泛型类型调用重载方法'equals'相关的知识,希望对你有一定的参考价值。

我试图从泛型类型中调用'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一致也是一种好习惯。

以上是关于对泛型类型调用重载方法'equals'的主要内容,如果未能解决你的问题,请参考以下文章

对泛型的理解

如何对泛型类型列表进行 instanceof 检查?

C# 使用自定义的泛型函数/方法对泛型数组进行四则运算

(转)java 泛型详解-绝对是对泛型方法讲解最详细

对泛型编程中泛型类型的一些理解

如何对泛型函数进行类型定义?