作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试 @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) { }
}
我在 onPostAction
的 @Override
上收到错误,为什么找不到正确的方法来覆盖?
这是针对剪刀石头布的实现,供想知道名称从何而来的人们使用。
确切的错误信息:
method does not override or implement a method from a supertype
我的目标是仍然使用当前类,所以对于RPSHumanPlayer
,我实际上想要这个签名:
public void onPostAction(final RPSHumanPlayer target, final RPSGesture gesture, final RPSResult result) { }
最佳答案
Player
中的方法onPostAction
本身是通用的。您已经在那里定义了 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
以及 A
和 R
>播放器
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) { }
}
关于java - 用泛型覆盖方法不起作用(找不到方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22517047/
我是一名优秀的程序员,十分优秀!