抽象函数,参数类型扩展 class
abstract function, parameter type extends class
我正在 Java 中构建图书馆管理应用程序。
我有一个名为 Material
的摘要 class。它有一个名为 equals
.
的抽象方法
有一个名为 Newspaper
的子 class,它当然实现了 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
的任何方法。它们都存在于扩展 Material
.
的 Newspaper
中
我得到了一些帮助on this thread of SO,但我无法让它真正发挥作用。
我想我没有真正理解的是如何使用作为通用参数工作的 class 的方法。
我相信这真的不难,但我对 Java 的经验真的很少,请不要对我太苛刻 :)
谢谢!
两点:
Class
对象表示对象class,equals
通常用于比较实例。您的 equals
声明暗示您想将此对象与 class 对象进行比较。
equals
是在 java.lang.Object
上定义的,所有对象都继承了它。为了让您的比较实现与 Java 库代码一起工作,您需要覆盖 Object.equals
。 equals
早于 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
.
我正在 Java 中构建图书馆管理应用程序。
我有一个名为 Material
的摘要 class。它有一个名为 equals
.
有一个名为 Newspaper
的子 class,它当然实现了 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
的任何方法。它们都存在于扩展 Material
.
Newspaper
中
我得到了一些帮助on this thread of SO,但我无法让它真正发挥作用。
我想我没有真正理解的是如何使用作为通用参数工作的 class 的方法。
我相信这真的不难,但我对 Java 的经验真的很少,请不要对我太苛刻 :)
谢谢!
两点:
Class
对象表示对象class,equals
通常用于比较实例。您的equals
声明暗示您想将此对象与 class 对象进行比较。equals
是在java.lang.Object
上定义的,所有对象都继承了它。为了让您的比较实现与 Java 库代码一起工作,您需要覆盖Object.equals
。equals
早于 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
.