0

我有以下类结构。

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.

我在这里做错了什么?

4

4 回答 4

2

尝试使类Action通用,而不是其方法之一。

public abstract class Action<T extends X>
{
   public abstract void execute(T t);
}

然后您可以将泛型类型参数分配TYin SomeAction

public class SomeAction extends Action<Y>
{
   public void execute(Y y) {}
}
于 2013-07-12T17:34:29.600 回答
1
  public <T extends X> void execute(T t);

是一种抽象方法,因为它没有任何主体。它应该被标记为摘要。

因此,在您的子类中,您需要覆盖它或将方法和子类都标记为抽象。

于 2013-07-12T17:33:40.137 回答
1

听起来您想T extends X成为扩展Action的属性,而不是方法调用。你应该写

 public abstract class Action<T extends X> {
   public abstract void execute(T t);
 }

进而

 public class SomeAction extends Action<Y> {
    ...
 }
于 2013-07-12T17:34:37.003 回答
1

您打破了 Liskov 原则:基本 Action 的execute方法能够执行任何类型的 X。但是在子类中,您将其限制为仅执行 Y 实例。那是减少合同,而不是延长合同。

于 2013-07-12T17:36:27.570 回答