Java 使用泛型限制了我使用特定类型,而我希望使用该类型的所有可能的子类

Java 使用泛型限制了我使用特定类型,而我希望使用该类型的所有可能的子类,java,generics,inheritance,Java,Generics,Inheritance,我有以下代码,由于其他限制,它以这种方式结束: public interface Action { } public interface Result { } public interface Player<A extends Action, R extends Result, P extends Player<A, R, P>> { } public interface Game<A extends Action, R extends Result, P e

我有以下代码,由于其他限制,它以这种方式结束:

public interface Action { }

public interface Result { }

public interface Player<A extends Action, R extends Result, P extends Player<A, R, P>> { }

public interface Game<A extends Action, R extends Result, P extends Player<A, R, P>> { }

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

public class RPSGame<P extends RPSPlayer<P>> extends AbstractGame<RPSGesture, RPSResult, P> { }
这里的
RPSGame
是一个原始类型,虽然我最初打算将其作为原始类型,但它添加了泛型以保持代码正常工作

问题是,我无法将其设置为非泛型,因为这样代码就不再使用我尝试过的所有内容进行编译,因此是否可以:

  • 是否从
    RPSGame
    类中删除泛型

  • 或者定义
    RPSGame RPSGame
    的方式(使用类型化参数),使其能够编译


看起来你对仿制药有点满意。我会重新开始,并尝试找出您需要泛型的确切位置。我甚至不能开始对(大部分是循环的)声明进行头尾分析。@Borishespider我感觉差不多,我真正需要泛型的地方主要是
A extends Action
R extends Result
,其余的都是一些热修复程序。。。这就是为什么我还在忙着设计项目结构。我想说你的主要问题是
Player
as
Player
的循环声明。这显然使声明泛型播放器类型变得不可能。你能从
播放器中删除它吗?似乎您总是将其声明为扩展自身,即它始终是
Player
——这可能是多余的。泛型是一种帮助确保您不会将“错误”类型混合在一起的方法,这与您尝试执行的操作相反。您已经展示了类/接口和类型参数,但还没有展示如何在播放器、动作、游戏和结果API中实际使用泛型。我不确定泛型是否能解决让您决定在这种特殊情况下使用泛型的任何问题。您可能需要先研究更传统的解决方案,如和设计模式。这些可以帮助您利用多态性,在多态性中,泛型倾向于尝试并防止您正在寻找的实现的“混合包”。
abstract public class GesturePlayer<A extends Action, R extends Result, P extends GesturePlayer<A, R, P>> implements Player<A, R, P> { }

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

public class RPSHumanPlayer extends RPSPlayer<RPSHumanPlayer> { }

public class RPSSimpleAIPlayer extends RPSPlayer<RPSSimpleAIPlayer> { }

public enum RPSGesture implements Gesture, Action, GestureFPSRules { }

public enum RPSResult implements Result { }
private void init() {
    RPSGame rpsGame = new RPSGame();
    rpsGame.addPlayer(new RPSHumanPlayer());
    rpsGame.addPlayer(new RPSSimpleAIPlayer());
    rpsGame.playGame();
}