题
对不起,我认为这是一个继承的问题:它是一个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
这你可能也有帮助。