generics不起作用的覆盖方法(未找到方法)
我试图@Override
类中的方法可能看起来像一个复杂的inheritance结构,但它实际上应该很简单,但我不能让它工作。
public interface Action { } public interface Result { } public interface Player { default public <P extends Player> void onPostAction(final P target, final A action, final R result) { } } abstract public class GesturePlayer implements Player { } abstract public class RPSPlayer extends GesturePlayer { } public class RPSHumanPlayer extends RPSPlayer { @Override public void onPostAction(final RPSPlayer target, final RPSGesture gesture, final RPSResult result) { } }
我在onPostAction
上得到错误,为什么找不到正确的覆盖方法?
这是一个Rock-Paper-Scissors实现,让人们想知道这个名字的来源。
确切的错误消息:
方法不会覆盖或实现超类型的方法
我的目标是仍然使用当前的类,因此对于RPSHumanPlayer
我实际上想要这个签名:
public void onPostAction(final RPSHumanPlayer target, final RPSGesture gesture, final RPSResult result) { }
Player
onPostAction
方法本身就是通用的。 你已经在那里定义了P
因此,任何覆盖它的方法也必须是通用的。
尝试
public class RPSHumanPlayer extends RPSPlayer { @Override public > void onPostAction(final P target, final RPSGesture gesture, final RPSResult result) { } }
A
和R
已经被GesturePlayer
定义为RPSGesture
和RPSResult
,但是仍然需要声明P
加成
如果它需要是那个确切的签名,那么你必须在Player
界面上定义P
以及A
和R
:
public interface Player> { default public void onPostAction(final P target, final A action, final R result) { } }
然后GesturePlayer
改变:
abstract public class GesturePlayer> implements Player { }
然后RPSPlayer
将自己定义为P
abstract public class RPSPlayer extends GesturePlayer { }
并且RPSHumanPlayer
可以具有以下方法:
public class RPSHumanPlayer extends RPSPlayer { @Override public void onPostAction(final RPSPlayer target, final RPSGesture gesture, final RPSResult result) { } }