【问题标题】:abstract function, parameter type extends class抽象函数,参数类型扩展类
【发布时间】:2016-06-15 15:58:52
【问题描述】:

我正在用 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 的经验真的很少,请不要对我太苛刻:)

谢谢!

【问题讨论】:

  • 为什么你的equals 方法将一个类作为它的参数?
  • 这证明我不明白我在做什么。现在我实际上明白了我在做什么,但仍然不明白我做了什么。我真的不明白“Class”的含义。

标签: java generics generic-programming generic-method


【解决方案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

【讨论】:

  • 我明白了。我按照你告诉我的那样更改了签名,并将 Material 转换为 Periodico(西班牙语报纸),所以我实际上可以访问它的所有方法(getFechaPublicacion 不在 Material 中)。
【解决方案2】:

两点:

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

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

【讨论】:

  • 你说得对,我还需要将它强制转换为我的对象,否则我无法访问所有方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多