gpt4 book ai didi

java - java中泛型的2种方式耦合

转载 作者:行者123 更新时间:2023-12-02 12:19:00 24 4
gpt4 key购买 nike

抱歉,我无法用一句话更好地解释这个标题!

所以问题来了,我正在用java制作一个小型纸牌游戏引擎,我试图为游戏定义尽可能通用的接口(interface)

所以我有这些接口(interface)

public interface Card
{
//some methods
}
public interface CardGame<TCard extends Card,TPlayer extends Player>
{
//example method
TPlayer getPlayerByName(String name);
}
public interface Player<TCardGame extends CardGame>
{
//HERE IS THE ISSUE
List<TCard> getCards();
}

问题出在最后一个界面,我想强制玩家返回游戏中相同类型的牌,即他是通用的

换句话说,Player<BannaCardGame> ,应该有List<BananCards>

但我找不到正确的语法来执行此操作,Player 界面内的 TCard 没有任何意义

那么我怎样才能实现这种行为呢?

最佳答案

首先,您可能需要重新考虑是否真的需要它。但不知道为什么您可能需要它等。这里有一些关于如何解决您的问题的建议:

不要将 Player 绑定(bind)到 CardGame,而是将两者绑定(bind)到 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();
}

现在,您只能定义使用 PlayerCard 的匹配实现的 CardGame

但同样,我不确定设计是否良好(为什么玩家实例应该取决于卡牌的类型?),但由于我们不知道您的要求以及为什么您决定这样设计,所以很难对此给出很多建议(无论如何它可能超出了SO的范围)所以我会把这个留给你。

编辑:

从您的评论看来,您似乎还想将 getGame() 添加到您的 Player 界面(注意 future 的问题:也将其​​添加到问题中,否则它可能会被错过)。

您可以像这样定义该方法(为了完整性,我将包括接口(interface)):

public interface Player<TCard extends Card> {     
List<TCard> getCards();

CardGame<TCard, ? extends Player<TCard>> getGame();
}

这意味着玩家可以返回(属于?)任何使用正确类型卡牌的游戏以及为该类型卡牌声明的任何类型的玩家。

如果您想进一步限制这一点,您可以扩展您的接口(interface)(也许这就是您真正想要的):

//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*/ }
}

关于java - java中泛型的2种方式耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45934458/

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