Zig*_*ggy 8 java casting arraylist
对不起,我认为这是一个继承问题:它一直是一个ArrayList问题!
好吧,我的问题比我想象的更具体.所以我有两个班级.卡片和区域.区域是持卡的盒子.
Zone,ZoneList和ZoneMap的前两个子类是存储卡的两种不同方式.其他子类,如Hand和PokerHand,有自己特定的方式处理他们存储的卡片.
复杂的地方就是Card也有子类,比如PokerCard,而ZoneList和ZoneMap的子类就是为了组织它们.
所以在ZoneList中,我protected ArrayList<Card> cardBox;
和PokerHand一直希望能够申报,cardBox = new ArrayList<PokerCard>();
因为PokerCard是一张卡.我得到的错误是,当涉及到ArrayLists时,我显然无法在Card和GangCard之间施放......所以我试图通过将cardBox重新声明为PokerHand private ArrayList<PokerCard> cardBox;
内部来解决这个问题,但这导致了隐藏的问题我的节目.
那么,问题是关于在ArrayLists之间进行转换?Java告诉我,我不能,所以任何关于我如何的想法?
ž.
Jon*_*eet 19
Marc和kolstae在如何解决问题方面给出了很好的答案,但我认为值得解释为什么你的原始代码不起作用.
为了简化问题,我倾向于将问题放在水果方面.假设我们有:
List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());
Run Code Online (Sandbox Code Playgroud)
如果这是允许的话,我们最终会在一堆香蕉中加入苹果,这显然是一件坏事.那么,问题出在哪里?第一行必须没问题,第三行必须没问题 - 你可以添加任何种类的水果List<Fruit>
- 所以问题必须在第二行.这是禁止的,正是为了避免这种问题.
这些帮助有用?
小智 12
如果我理解正确,您应该声明:
public class ZoneList<T extends Card> {
protected List<T> cardBox;
}
public class PokerHand extends ZoneList<PokerCard> {
public PokerHand() {
cardBox = new ArrayList<PokerCard>();
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ski 10
首先,使用getter/setter方法通常比直接访问属性更好,特别是如果你要进行大量复杂的继承.
至于泛型问题,您可以尝试在超类(或顶级接口/抽象类)中定义cardBox getter,如下所示:
protected ArrayList<? extends Card> getCardBox();
Run Code Online (Sandbox Code Playgroud)
这样你就可以在子类中挖掘它并让它们返回任何类型的Card子类的列表.
一种方法是首先转换为ArrayList:
ArrayList<Card> cards = (ArrayList<Card>)(ArrayList<?>) (pokerCardObjects);
Run Code Online (Sandbox Code Playgroud)
没有铸造的另一种选择
使用流:
ArrayList<Card> cards = pokerCardObjects.stream().collect(Collectors.toCollection(ArrayList::new);
Run Code Online (Sandbox Code Playgroud)
或者创建一个新的ArrayList:
ArrayList<Card> cards = new ArrayList<>(pokerCardObjects);
Run Code Online (Sandbox Code Playgroud)
小智 6
如前所述,你可以不投ArrayList<PokerCard>
给ArrayList<Card>
,但你可以投ArrayList<PokerCard>
给ArrayList<? extends Card>
.或者更好地List<? extends Card>
用作返回值,因为您可能无论如何都不依赖于ArrayList实现:
protected ArrayList<? extends Card> getCardBox();
Run Code Online (Sandbox Code Playgroud)
至于你在评论中的问题,结构应该如你所描述的那样工作: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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
37911 次 |
最近记录: |