我正在尝试@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
答案 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) { }
}
A
和R
已由GesturePlayer
定义为RPSGesture
和RPSResult
,但P
仍需要声明。< / p>
<强>加成强>
如果需要确切签名,那么您必须在P
界面上定义A
以及R
和Player
:
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) { }
}