java - 为泛型类型调用重载方法 'equals'

标签 java oop generics 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,而是重载它(相同的方法名称,不同的签名)。要正确地从 Object 重写 equals,您必须匹配方法签名。这意味着您的 equals 方法必须采用 Object,而不是 Person

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

最好在任何旨在重写父类(super class)方法或实现接口(interface)方法的方法上包含 @Override 注释。如果您这样做了,那么编译器会提醒您您的方法没有重写 equals

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

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

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

关于java - 为泛型类型调用重载方法 'equals',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55598703/

相关文章:

java - 从 Activity 中的另一个类调用方法返回 null

java - 具有按钮和文本的 GWT 小部件?

java - 在scala中使用泛型创建java匿名类的问题

java - 在java中实例化自界泛型

iOS - 如何使用泛型在类上遵守 NSItemProviderWriting 和 NSItemProviderReading 协议(protocol)

java - Google Docs PDF Streaming 比 java servlet Stream 更快?

Java - 等待第三方线程完成

php - 使用 PHP 对象设置递归属性是否安全?

c# - 将对象存储在数组中然后访问它们

.net - VB.NET:获取实例的类名