使用泛型限制我使用特定类型,而我想使用该类型的所有可能的子类

时间:2014-03-20 15:02:33

标签: 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 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> { }

其他相关课程/接口:

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();
}

这里RPSGame是一种原始类型,而我最初打算将它作为原始类型,它添加了泛型以保持代码正常工作。

问题在于我无法使其成为非泛型的,因为代码不再编译我尝试过的所有内容,因此可以:

  • RPSGame班级删除泛型?

  • 或者以这种方式定义RPSGame rpsGame(使用类型参数),它是否编译?

0 个答案:

没有答案