首先,你可能想重新考慮你是否真的需要這個。但是不知道爲什麼,你可能需要等這裏的你如何能解決你的問題的一些建議:
不要把Player
到CardGame
但配合既Card
:
public interface Card {}
public interface CardGame<TCard extends Card,TPlayer extends Player<TCard>> {
//example method
TPlayer getPlayerByName(String name);
}
public interface Player<TCard extends Card> {
List<TCard> getCards();
}
現在,你只允許定義使用Player
和Card
的匹配實現的CardGame
。但是,我不確定設計是否好(爲什麼玩家實例要依賴於卡的類型?),但是由於我們不知道你的需求以及你爲什麼決定這樣設計,所以很難在這方面給予很多建議(而且它可能超出了SO的範圍),所以我會留給你。
編輯:
從您的意見,似乎你也想加入getGame()
您Player
接口(注:對於未來的問題:補充一點,這個問題爲好,否則可能會丟失)。
你可以這樣定義該方法(我將包括完整的接口):
public interface Player<TCard extends Card> {
List<TCard> getCards();
CardGame<TCard, ? extends Player<TCard>> getGame();
}
這意味着玩家可以返回(屬於哪一種?),使用權類型卡的所有遊戲以及爲該類型的卡申報的任何類型的玩家。
如果您想進一步限制這個,你可以擴展你的接口(也許這就是你究竟是什麼後):然後
//for the changes on TPlayer see the comment on Player
public interface CardGame<TCard extends Card,TPlayer extends Player<TCard, TPlayer>> {
//example method
TPlayer getPlayerByName(String name);
}
//Require the implementations to register themselves as generic types
public interface Player<TCard extends Card, TPlayer extends Player<TCard, TPlayer>> {
List<TCard> getCards();
CardGame<TCard, TPlayer> getGame();
}
一個BananaCard
遊戲看起來是這樣的:
class BananaPlayer implements Player<BananaCard, BananaPlayer> {
public List<BananaCard> getCards() { /*snip*/ }
public CardGame<BananaCard, BananaPlayer> getGame() { /*snip*/ }
}
class BananaGame implements CardGame<BananaCard, BananaPlayer> {
public BananaPlayer getPlayerByName(String pName) { /*snip*/ }
}
首先,不要使用原始類型。 – shmosel
你確定要保持對你自我的神祕感:P,我不確定我在追隨,但是感謝評論 –
'TCardGame擴展CardGame'使用raw(=未參數化)類型'CardGame'。不要這樣做,這是不安全的。 – shmosel