【问题标题】:Define abstract methods with generics用泛型定义抽象方法
【发布时间】:2012-11-28 18:05:57
【问题描述】:

我已经阅读了很多关于泛型的文章,但在 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 中的 check 方法。 关于可能缺少什么的任何线索?

【问题讨论】:

标签: java class generics


【解决方案1】:

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

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) { ... }
}

【讨论】:

    【解决方案2】:

    怎么样:

    interface ISound<T> {
        public boolean check(T d);
    }
    
    abstract class Alarm implements ISound<Alarm> {
        @Override
        public boolean check(Alarm d) { return true; };
    }
    

    (希望我正确理解了你的问题!)

    【讨论】:

      【解决方案3】:

      你没有扩展任何类!!

      abstract class Alarm extends Sound {
      }
      

      这是正确的方法……

      【讨论】:

        猜你喜欢
        • 2018-07-05
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多