0

I am building a library management application in Java.

I have an abstract class called Material. It has an abstract method called equals.

There is a subclass called Newspaper and it of course implements equals, with the exact same signature as equals has inside 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 cannot resolve any of the methods of elementoAComparar. They all exist in Newspaper which does extend Material.

I got some help on this thread of SO but I cannot make it really work.

I guess what I don't really get is how to use methods of a class which is working as a generic parameter.

I am sure this is really not that hard, but I have really little experience with Java, please don't be too hard on me :)

Thanks!

4

2 回答 2

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.

于 2016-06-15T16:46:11.553 回答
0

两点:

  • Classobjects 表示对象类,equals通常用于比较实例。您的equals声明意味着您想将此对象与类对象进行比较。
  • equals在 上定义java.lang.Object,所有对象都继承它。为了让您的比较实现与 Java 库代码一起使用,您需要覆盖Object.equals. equals早于 Java 中的泛型,因此Object.equals不使用它们。您的实现需要检查正在比较的实例并将其转换为您的对象类型,以便获取另一个对象的字段。

在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?提供了很好的总结和示范。

于 2016-06-15T16:39:58.607 回答