抽象函数,参数类型扩展 class

abstract function, parameter type extends class

我正在 Java 中构建图书馆管理应用程序。

我有一个名为 Material 的摘要 class。它有一个名为 equals.

的抽象方法

有一个名为 Newspaper 的子 class,它当然实现了 equals,其签名与 equalsMaterial 中的签名完全相同:

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 的任何方法。它们都存在于扩展 Material.

Newspaper

我得到了一些帮助on this thread of SO,但我无法让它真正发挥作用。

我想我没有真正理解的是如何使用作为通用参数工作的 class 的方法。

我相信这真的不难,但我对 Java 的经验真的很少,请不要对我太苛刻 :)

谢谢!

两点:

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

What issues should be considered when overriding equals and hashCode in Java?的答案很好的总结和示范。

正如@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.