gpt4 book ai didi

带有类型参数的 Java 类

转载 作者:行者123 更新时间:2023-11-30 01:43:52 25 4
gpt4 key购买 nike

我在使用 Java 类中的类型参数时遇到问题。我有一个名为 Game 的父类(super class)

public abstract class Game<T extends Player> implements Serializable {
public Game(GameEnum game, Player player1, T player2) {
this.timer = new Timer();
this.game = game;
this.player1 = player1;
this.player1.setPlayer1();
this.player2 = player2;
}
}

然后是我的类扩展了它

public abstract class OtherGame<T extends Player> extends Game<T> {
public OtherGame(GameEnum game, Player player1, T player2) {
super(game, player1, player2);
}
}

然后是 ChessGame 类,它扩展了 OtherGame 类

public class ChessGame<T extends Player> extends OtherGame<T> {
public ChessGame(Player player) {
super(GameEnum.CHESS, player, new ChessComputer());

//Here is the Error that the Constructor with the Param. ChessComputer
//does not exist and i can cast the ChessComputer to T.

((Computer) super.player2).setInput(this.chessboard);
this.playerFile = new File(CHESSGAME, String.format("%s vs. Computer%s", super.player1, FILEEXT));
this.comFile = new File(CHESSGAME, super.player1.hashCode() + "");
this.gameMenu();
}
}

现在我也有一些 PlayerClasses

public class Player implements Serializable {
public Player(String name, boolean player1) {
this.name = name;
this.player1 = player1;
}
}

我的 Computerclass 扩展了 Playerclass

public abstract class Computer extends Player {
public Computer() {
super("Computer", false);
}
}

我有一个 ChessComputer 类,它扩展了 Computer 类

public class ChessComputer extends Computer {
public ChessComputer() {
super();
}
}

然后我有一个类调用 ChessGame 类的构造函数,如下所示:

new ChessGame<ChessComputer>(this.player);
//Here is no error

为什么会出现没有这样的构造函数的错误,因为我想如果我使用 TypeVariable,例如 T,我可以为构造函数提供我所说的要扩展的子类的任何子类。我还使用 Typeargument ChessComputer 来调用 ChessGame 构造函数,我认为它会“赋予”T 类 ChessComputer。我对 Typearguments 以及它们在 Java 中的工作原理有所了解,但显然还不够。

如果我没有使用正确的词语来描述它,我很抱歉,那是因为英语不是我的母语。

最佳答案

这里类派生类对的结构具有泛型类型约束:

public class ChessGame<T extends Player> extends OtherGame<T>
public ChessGame(Player player) {
super(GameEnum.CHESS, player, new ChessComputer());

OtherGame 构造函数的第三个参数仅限于类型 T,即使它是 ChessComputer 的子类型。它需要 T 的强制转换,例如 super(GameEnum.CHESS, player, (T) new ChessComputer());

另一方面,正如 @jrook 评论的那样,如果您没有其他计划,那么使用泛型类型不太适合这里。您应该考虑使用接口(interface)作为 Player 类来实现公共(public) IPlayer 接口(interface),并且您可以将子类传递给其他类的构造函数。

关于带有类型参数的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942477/

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