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

时间:2016-06-15 15:58:53

标签: java generics generic-programming generic-method

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

谢谢!

2 个答案:

答案 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声明暗示您要将此对象与类对象进行比较。
  • equalsjava.lang.Object上定义,所有对象都继承。为了使比较实现与Java库代码一起使用,您需要覆盖Object.equalsequals早于Java中的泛型,因此Object.equals不使用它们。您的实现需要检查要比较的实例并将其转换为您的对象类型,以便获取另一个对象的字段。

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