泛型不起作用的覆盖方法(未找到方法)

时间:2014-03-19 20:12:01

标签: java inheritance override

我正在尝试@Override一个类似于具有复杂继承结构的类中的方法,但它实际上应该非常简单,但我不能让它工作。

public interface Action { }

public interface Result { }

public interface Player<A extends Action, R extends Result> {
    default public <P extends Player<A, R>> void onPostAction(final P target, final A action, final R result) { }
}

abstract public class GesturePlayer<A extends Action, R extends Result> implements Player<A, R> { }

abstract public class RPSPlayer extends GesturePlayer<RPSGesture, RPSResult> { }

public class RPSHumanPlayer extends RPSPlayer {
    @Override
    public void onPostAction(final RPSPlayer target, final RPSGesture gesture, final RPSResult result) { }
}

我在@Override的{​​{1}}上收到错误,为什么找不到正确的覆盖方法?

这是针对Rock-Paper-Scissors的实现,让人们不知道这个名字的来源。

确切的错误讯息:

  

方法不会覆盖或实现超类型

中的方法

我的目标是仍然使用当前的类,因此对于onPostAction我实际上想要拥有此签名:

RPSHumanPlayer

1 个答案:

答案 0 :(得分:3)

onPostAction中的方法Player本身就是通用的。您已在那里定义P。因此,任何覆盖它的方法也必须是通用的。

尝试

public class RPSHumanPlayer extends RPSPlayer {
    @Override
    public <P extends Player<RPSGesture, RPSResult>> void onPostAction(final P target,
       final RPSGesture gesture, final RPSResult result) { }
}

AR已由GesturePlayer定义为RPSGestureRPSResult,但P仍需要声明。< / p>

<强>加成

如果需要确切签名,那么您必须在P界面上定义A以及RPlayer

public interface Player<A extends Action, R extends Result, P extends Player<A, R, P>> {
    default public void onPostAction(final P target, final A action, final R result) { }
}

然后GesturePlayer会相应更改:

abstract public class GesturePlayer<A extends Action, R extends Result,
     P extends Player<A, R, P>> implements Player<A, R, P> { }

然后RPSPlayer将自己定义为P

abstract public class RPSPlayer extends GesturePlayer<RPSGesture, RPSResult, RPSPlayer> { }

并且RPSHumanPlayer可以使用以下方法:

public class RPSHumanPlayer extends RPSPlayer {
    @Override
    public void onPostAction(final RPSPlayer target, final RPSGesture gesture, final RPSResult result) { }
}