由於參數是靜態的,我在嘗試將參數傳遞給父類泛型類的構造函數時出現問題,因此我必須在編譯時顯式指定類型。傳遞靜態字段爲通用類型
這裏有兩類問題:
public class CardStack<T extends Card> extends ArrayList<T>
public class Deck<T extends Card> extends CardStack<T>
我之所以需要「T擴展卡」並不僅僅是卡是因爲我共享客戶端之間的這些類(這需要使它們)和一個服務器(它只關心值)。
我靜態地創建了一副單卡,在放入每個卡組後將被洗牌。
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));
}
}
構造甲板:
public Deck() {
super(NEW_DECK); // Error Here
Collections.shuffle(this);
}
構造CardStack:
protected CardStack(final CardStack<? extends T> cardStack) {
super(cardStack);
}
我無法找出把什麼 「擴展T'」。我已經嘗試了一些組合,但似乎沒有任何工作,所以似乎我不完全理解發生了什麼。這種設計可能嗎?如果不是更好的解決方案。謝謝!
============================================== ===========================
編輯:更好地解釋使用泛型的推理。
首先,我想在上面說過的客戶端和服務器之間共享這些類。真正的問題是當我試圖擴展這些類來呈現它們時。所有客戶端類都包含渲染信息和方法(x/y座標,繪製和檢測點擊的方法)。
這工作正常我ClientCard extends Card
類,但是當我試圖讓ClientCardStack extends CardStack
因爲CardStack包含卡的問題出現了,我無法使它們,因爲它們不包含正確的信息,而我真正需要的是ClientCardStack extends CardStack<ClientCard>
導致所有這些問題。
如果我創建一個'class MyCard extends Card {}'然後創建一個'Deck',當我的構造函數填充'Card'後,當我嘗試從它獲取一個'MyCard'時會發生什麼?我懷疑你誤解了某些東西,但你對爲什麼認爲需要泛型的解釋並不能說明誤解是什麼。我同意答案,表明你可能不應該在這裏使用泛型。或者至少,泛型使設計複雜化。傳遞'NEW_DECK'就像你試圖做的*永遠不會*工作。您需要使用類似抽象工廠方法的東西。 –
Radiodef
謝謝,我現在明白爲什麼它目前不能工作,但我想知道我的方法是否仍然有效。我已經更新了使用泛型的理由。 – Kelvin