我有以下类结构。
public abstract class X { }
public class Y extends X { }
我想做以下事情:
public abstract class Action {
public abstract <T extends X> void execute(T t);
}
public class SomeAction extends Action {
public void execute(Y y) { }
}
编译器给出了以下错误:
类型
SomeAction
必须实现继承的抽象方法Action.execute(T)
我确实要覆盖execute()
,但我希望参数是X
的子类。
我在这里做错了什么?
答案 0 :(得分:2)
尝试将类Action
设为泛型,而不是其中一种方法。
public abstract class Action<T extends X>
{
public abstract void execute(T t);
}
然后您可以在T
中将通用类型参数Y
指定为SomeAction
:
public class SomeAction extends Action<Y>
{
public void execute(Y y) {}
}
答案 1 :(得分:1)
public <T extends X> void execute(T t);
是一个抽象方法,因为它没有任何正文。它应该标记为摘要。
因此,在您的子类中,您需要覆盖它或将方法和子类都标记为抽象。
答案 2 :(得分:1)
听起来您希望T extends X
成为扩展Action
的类的属性,而不是方法调用。你应该写
public abstract class Action<T extends X> {
public abstract void execute(T t);
}
然后
public class SomeAction extends Action<Y> {
...
}
答案 3 :(得分:1)
你违反了Liskov原则:基本Action的execute
方法能够执行任何类型的X.但是在子类中,您将其限制为仅执行Y实例。这减少了合同,而不是延长合同。