由于参数是静态的,因此在尝试将参数传递给父泛型类的构造函数时遇到问题,因此我必须在编译时明确指定类型。
这是有问题的两个类:
public class CardStack<T extends Card> extends ArrayList<T>
public class Deck<T extends Card> extends CardStack<T>
我之所以需要“ T扩展Card”而不是Card的原因是因为我正在客户端(需要渲染它们)和服务器(仅关心值)之间共享这些类。
我正在静态创建一个纸牌,将其放入每个纸牌后将对其进行洗牌。
private static final CardStack<Card> NEW_DECK;
static {
NEW_DECK = new CardStack<>(DECK_SIZE);
for (int i = 0; i < DECK_SIZE; i++) {
NEW_DECK.push(new Card(Card.Suit.values()[i / Card.CARD_VALUE_MAX],
i % Card.CARD_VALUE_MAX + 1));
}
}
Deck的构造函数:
public Deck() {
super(NEW_DECK); // Error Here
Collections.shuffle(this);
}
CardStack的构造函数:
protected CardStack(final CardStack<? extends T> cardStack) {
super(cardStack);
}
我在弄清楚“?extended T”的含义时遇到了麻烦。我已经尝试了多种方法,但是似乎没有任何效果,因此我似乎不太了解发生了什么。这种设计可行吗?如果没有,那将是一个更好的解决方案。谢谢!
================================================== =======================
编辑:更好地解释使用泛型的理由。
首先,我想在上述客户端和服务器之间共享这些类。真正的问题是当我尝试扩展这些类以呈现它们时。所有的Client类都包含信息和渲染方法(x / y坐标,绘制和检测点击的方法)。
这对于我的课程
ClientCard extends Card
来说效果很好,但是当我尝试制作ClientCardStack extends CardStack
时出现问题,因为CardStack包含卡片,由于它们不包含正确的信息,所以我无法呈现它们,而我真正需要的是ClientCardStack extends CardStack<ClientCard>
导致所有这些问题。 最佳答案
问题在于NEW_DECK
的类型为CardStack<Card>
,而您正在调用的超级构造函数使用的是CardStack<? extends T>
。 T
不一定总是Card
的超类。
最好的解决方案实际上是不使用泛型。继承规定,无论您具有客户端版本的实例还是服务器版本的实例,您仍然具有Card
的实例,因此,当您不知道自己在客户端还是服务器上时,只需使用Card
。