泛型覆盖了混淆

时间:2013-07-12 17:31:38

标签: java generics override

我有以下类结构。

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 个答案:

答案 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实例。这减少了合同,而不是延长合同。