java - 用泛型定义抽象方法

标签 java class generics

我已经阅读了很多关于泛型的文章,但在用 Java 实现简单的层次结构时我仍然遇到一些基本问题。目标是定义一个抽象方法,该方法将比较同一类的两个对象,如果对象来自不同的类,则应返回 false。示例:

我们定义抽象类Sound

abstract class Sound{
    public boolean check(Sound d){return false;};
}

一些扩展 Sound 的类和另一个从它扩展的抽象类,比如 Alarm

abstract class Alarm extends Sound{
    @Override
    public boolean check(Alarm d){//Do something and return boolean};
}

还有一些从它扩展而来的类。

简单的解决方案是按照显示的方式定义方法,它会起作用,但我觉得有更好的方法来强制层次结构,因此 Sound 类定义该方法只能与相同的参数一起使用类。

我对泛型的尝试:

abstract class Sound{
    public <T extends Sound> boolean check(T d){return false;};
}

abstract class Alarm extends Sound{
    @Override
    public <T extends Alarm> boolean check(T d){//Do something and return boolean};
}

abstract class Alarm extends Sound{
    @Override
    public boolean check(Alarm d){//check and return boolean};
}

Java 向编译器提示,因为我没有覆盖 Alarm 中的检查方法。 关于可能遗漏什么的任何线索?

最佳答案

你的想法本质上是错误的。
泛型方法的要点是调用者可以指定满足约束的任何类型。
换句话说,调用者可以写

sound.<NonAlarm> check(...);

其中 NonAlarm 是继承 Sound 的任何类。

由于 Alarm 继承了 Sound,它的 check() 方法必须具有相同的约束。

相反,您可以使用 CRTP :

public abstract class Sound<T extends Sound<T>> {
    public abstract boolean check(T d);
}

public class Alarm extends Sound<Alarm> {
    @Override
    public boolean check(Alarm d) { ... }
}

关于java - 用泛型定义抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611608/

相关文章:

Java 通用容器类

Java Reflection//不能设置java.lang.Boolean为(boolean)true

c# - 类中的 var 给出错误

class - 究竟什么是类工厂?

typescript - 类型 'awaited T' 的参数不可分配给类型 'T' 的参数

Java 泛型返回 int[] 而不是 Integer[]

java - 编写自定义 Chef Recipe 来安装和运行自制应用程序

java - 用户注销后 JSessionID 没有改变 - 这是安全问题吗?

java - 用于 Java 应用程序的 Amazon Kinesis Data Analytics : Avro issue in deserialization incoming messages

c++ - 具有不同类型的类