Java 在子类中指定集合的类型

Java 在子类中指定集合的类型,java,Java,我有一个应用程序,用户可以在其中玩多种类型的游戏。每个游戏都扩展了game类,其中包含与游戏相关的各种内容。每个游戏还具有一个关联的用户类,该类扩展了包含电子邮件、用户名等的用户,如ChessUser和ScrabbleUser,其中包含有关游戏的统计信息和其他用户信息 在每个游戏类中,我需要一个当前正在玩游戏的所有用户的列表。由于所有游戏都需要此列表,我希望将其放置在User类中,但由于它包含玩游戏的用户类型,ChessGame将包含一个ChessUsers列表,因此在检索时,如果不进行值转换,

我有一个应用程序,用户可以在其中玩多种类型的游戏。每个游戏都扩展了game类,其中包含与游戏相关的各种内容。每个游戏还具有一个关联的用户类,该类扩展了包含电子邮件、用户名等的用户,如ChessUser和ScrabbleUser,其中包含有关游戏的统计信息和其他用户信息

在每个游戏类中,我需要一个当前正在玩游戏的所有用户的列表。由于所有游戏都需要此列表,我希望将其放置在User类中,但由于它包含玩游戏的用户类型,ChessGame将包含一个ChessUsers列表,因此在检索时,如果不进行值转换,我将无法执行此操作,而我不希望执行此操作。有没有一种方法可以在不强制转换检索到的值的情况下执行此操作

一些示例代码:

public class Game {
  private List<Player> players;

  public Player getPlayer(int index) {
    return players.get(index);
  }
}

public class Player {
  private String username;
  private String email;
}

public class ChessGame extends Game {
  // getPlayer now needs to return a ChessPlayer, hopefully without casting
}

public class ChessPlayer extends Player {
  private int checkmates;
}
使用泛型:

public class Game<T extends Player> {

    private List<T> players;

    public T getPlayer(int index) {
        return players.get(index);
    }
}

public class Player {
  private String username;
  private String email;
}

public class ChessPlayer extends Player {

}

public class Chess extends Game<ChessPlayer> {

}

您可以使用java获得此功能:


你要找的是。检查getPlayer。返回类型不是void,而是Player。泛型适合这样的情况吗?我一直认为这一点对于类来说更重要,因为类的整个存在就是提供某些类型的对象。泛型类型是对类的某种细化。在这种情况下,你表明,在国际象棋棋手玩。
public class Game<T extends Player> {
  private List<T> players;

  public T getPlayer(int index) {
    return players.get(index);
  }
}
public class ChessGame extends Game<ChessPlayer> {
  // getPlayer now needs to return a ChessPlayer, hopefully without casting
}