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

コンパイラは私に次のエラーを与えています:

TypeSomeActionは、継承された抽象メソッドを実装する必要がありますAction.execute(T)

をオーバーライドしたいexecute()のですが、パラメータを のサブクラスにしたいのですX

ここで何が間違っていますか?

4

4 に答える 4

1

Liskov の原則を破っています。ベース Action のexecuteメソッドは、あらゆる種類の X を実行できます。しかし、サブクラスでは、Y インスタンスのみの実行に制限しています。それは、契約を延長するのではなく、契約を減らすことです。

于 2013-07-12T17:36:27.570 に答える
1
  public <T extends X> void execute(T t);

本体を持たない抽象メソッドです。抽象としてマークする必要があります。

したがって、子クラスでは、これをオーバーライドするか、メソッドとサブクラスの両方を抽象としてマークする必要があります。

于 2013-07-12T17:33:40.137 に答える