由于参数是静态的,因此在尝试将参数传递给父泛型类的构造函数时遇到问题,因此我必须在编译时明确指定类型。

这是有问题的两个类:

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

10-08 11:49