【问题标题】:Call the overload method 'equals' for a generic type为泛型类型调用重载方法“等于”
【发布时间】:2019-04-10 02:08:00
【问题描述】:

我正在尝试从泛型类型调用“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

【问题讨论】:

    标签: java oop generics equals


    【解决方案1】:

    你没有覆盖equals,你是在重载它(相同的方法名称,不同的签名)。要正确地从 Object 覆盖 equals,您必须匹配方法签名。这意味着您的equals 方法必须采用Object,而不是Person

    public boolean equals(Object o) {  // ...
    

    @Override 注释包含在任何旨在覆盖超类中的方法或实现接口中的方法的方法上是一种很好的做法。如果你这样做了,那么编译器会提醒你你的方法没有覆盖equals

    @Override
    public boolean equals(Object o) {  // ...
    

    这也意味着在转换和比较成员值之前,您需要测试传入的对象是否实际上是 Person

    根据hashCode contract,覆盖hashCode 也是一种很好的做法,以便与equals 保持一致。

    【讨论】:

    • 谢谢你的回答,我知道我没有压倒一切。但是为什么我的重载方法不起作用?该程序在“运行时”配偶上调用equals,采用Person 类型。
    • @Tal 它不起作用,因为 SortedGroup func 编译会将您的调用解析为 equals(Object) 而不是 equals(Person),因为它不知道 T 在运行时将是 Person。你必须把自己放在编译器的位置上,它只能使用它编译的文件中给出的信息。如果您将T 绑定为始终为Person (&lt;T extends Person&gt;),那么它可能会起作用。但是你不应该这样做,而是适当地重载equals(Objects)(和hashCode())......
    • ... 因为您仍然会遇到其他依赖 equals 和 hashCode 的类的问题,例如 java.util.* 中的容器(例如 ArrayListHashMap...)。 @塔尔
    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多