gpt4 book ai didi

java - 用泛型覆盖方法不起作用(找不到方法)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:36 26 4
gpt4 key购买 nike

我正在尝试 @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) { }
}

AR 已经被 GesturePlayer 定义为 RPSGestureRPSResult,但是 P 仍然需要声明。

添加

如果它需要是那个精确的签名,那么你必须在 上定义 P 以及 AR >播放器界面:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com