对不起,我认为这是一个继承的问题:它是一个ArrayList的问题一直

好吧,我的问题比我想象的更具体。所以,我有类两个家庭。卡和区域。区是持卡盒。

区域,ZoneList和ZoneMap的第一两个子类意味着是存储卡的两种不同的方式。此外子类,如手,PokerHand,有对付他们存储卡自身的具体方式。

其中就变得复杂的是,卡还具有亚类,如PokerCard,并且ZoneList和ZoneMap的子类是为了组织的那些。

因此,在ZoneList我已经protected ArrayList<Card> cardBox;和PokerHand我期望能够宣布cardBox = new ArrayList<PokerCard>();因为PokerCard是一个卡。我正的错误是,我显然不能施放卡和GangCard之间,当涉及到的ArrayList ......所以,我想通过刚刚重新声明cardBox作为内部PokerHand private ArrayList<PokerCard> cardBox;来解决这个问题,但导致隐藏了是窃听我的节目。

SO真的,问题是大约的ArrayList之间铸造? Java的告诉我,我不能,所以任何想法如何,我可以?

Ž。

有帮助吗?

解决方案

如果我理解正确的话,你应该声明:

public class ZoneList<T extends Card> {
   protected List<T> cardBox;
}

public class PokerHand extends ZoneList<PokerCard> {
   public PokerHand() {
      cardBox = new ArrayList<PokerCard>();
   }
}

其他提示

Marc和kolstae在如何解决这个问题方面都给予很好的答案,但我认为这是值得解释的为什么的原密码不能正常工作。

为了简化问题,我倾向于把这个问题在水果方面。假设我们有:

List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());

如果这是允许的,我们最终在一串香蕉,这显然是一件坏事,一个苹果。那么,问题出在哪里?第一行有好起来的,第三行有好起来的 - 你可以将任何一种水果添加到List<Fruit> - 所以这个问题必须在第二行。这是什么禁止的,正是为了避免这种问题。

这是否帮助呢?

首先,它通常是更好的做法是使用getter / setter方法不是直接访问属性,特别是如果你打算做了很多复杂的继承。

作为用于泛型问题,你可以尝试在超类中定义cardBox吸气剂(或顶层接口/抽象类)为:

protected ArrayList<? extends Card> getCardBox();

这样,你可以在子类中ovverride它,并让他们返回任何类型的卡子类的列表。

做到这一点的一种方式是通过铸造第一至ArrayList的:

ArrayList<Card> cards = (ArrayList<Card>)(ArrayList<?>) (pokerCardObjects);

无铸造另一个备选方案:

使用流:

ArrayList<Card> cards = pokerCardObjects.stream().collect(Collectors.toCollection(ArrayList::new);

或创建一个新的ArrayList:

ArrayList<Card> cards = new ArrayList<>(pokerCardObjects);

如前所述,你可以不投ArrayList<PokerCard>ArrayList<Card>,但你可以施放ArrayList<PokerCard>ArrayList<? extends Card>。或者更好地利用List<? extends Card>为您的返回值,因为你可能不依赖于该ArrayList实现反正:

protected ArrayList<? extends Card> getCardBox();

至于在评论你的问题,施工时应像你描述的工作:List<? extends Card> list = new ArrayList<Card>();。你可能需要填写你的列表中,因此该方法可能是这样的:

protected ArrayList<? extends Card> getCardBox() {
    List<Card> list = new ArrayList<Card>();
    list.add(pokerCard1);
    list.add(pokerCard2);
    return java.util.Collections.unmodifiableList(list);
}

这是要依赖于访问控制是在Zonelist该ArrayList什么。我从debugger语句的假设是,它要么是无人盯防,公共或保护。子类可以“隐藏”它具有通过定义具有相同的名称的变量访问父类变量。还可以使用this关键字来引用的特定对象实例和super关键字来引用到母体。

下面是Java上基本访问控制良好的链接:

http://java.sun.com/docs /books/tutorial/java/javaOO/accesscontrol.html

这你可能也有帮助。

http://java.sys-con.com/node/46344

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top