我一直在阅读关于泛型的很多东西,但我仍然有一些在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类定义该方法应仅用于具有相同参数的方法类。
我尝试过Generics:
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方法。 什么可能遗失的任何线索?
答案 0 :(得分:5)
你的想法本质上是错误的 泛型方法的要点是调用者可以指定满足约束的任何类型 换句话说,调用者可以写
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) { ... }
}
答案 1 :(得分:0)
如下:
interface ISound<T> {
public boolean check(T d);
}
abstract class Alarm implements ISound<Alarm> {
@Override
public boolean check(Alarm d) { return true; };
}
(我希望我能正确理解你的问题!)
答案 2 :(得分:-1)
你没有扩展任何课程!!
abstract class Alarm extends Sound {
}
这是正确的方法......