我正在用Java构建一个库管理应用程序。
我有一个名为Material
的抽象类。它有一个名为equals
的抽象方法。
有一个名为Newspaper
的子类,当然它实现equals
,与equals
内的Material
具有完全相同的签名:
public <T extends Material> boolean equals(Class<T> elementoAComparar) {
if (this.getTitulo().equals(elementoAComparar.getTitulo()) && this.getFechaPublicacion().equals(elementoAComparar.getFechaPublicacion())) {
return true;
} else {
return false;
}
}
Java无法解析elementoAComparar
的任何方法。它们都存在于Newspaper
中,它确实扩展了Material
。
我得到了一些帮助on this thread of SO,但我无法让它真正起作用。
我想我真正得到的是如何使用作为通用参数的类的方法。
我确信这真的不是那么难,但我对Java的经验很少,请不要对我太过刻苦:)
谢谢!
答案 0 :(得分:1)
正如@Ajit George所提到的,如果你试图实现一个平等方法,那么就有更简洁的方法。但是,如果您只是想编译和运行代码,那么您需要更改方法的签名。 Java无法解析elementoAComparar
的方法,因为Class
没有Material
那些方法。
您需要更改equals
方法签名
public <T extends Material> boolean equals(Class<T> elementoAComparar)
到
public <T extends Material> boolean equals(T elementoAComparar)
第一个签名告诉Java您将传递Class
对象的实例。第二个告诉Java你将传递一个Material
的对象实例。
答案 1 :(得分:0)
两点:
Class
个对象表示对象类,equals
通常用于比较实例。您的equals
声明暗示您要将此对象与类对象进行比较。equals
在java.lang.Object
上定义,所有对象都继承。为了使比较实现与Java库代码一起使用,您需要覆盖Object.equals
。 equals
早于Java中的泛型,因此Object.equals
不使用它们。您的实现需要检查要比较的实例并将其转换为您的对象类型,以便获取另一个对象的字段。What issues should be considered when overriding equals and hashCode in Java?的回答提供了一个很好的总结和演示。