[英]Casting between ArrayLists in Java
對不起,我認為這是一個繼承問題:它一直是一個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重新聲明為private ArrayList<PokerCard> cardBox;
來解決這個private ArrayList<PokerCard> cardBox;
在PokerHand里面,但這導致了隱藏我的程序。
那么,問題是關於在ArrayLists之間進行轉換? Java告訴我,我不能,所以任何關於我如何的想法?
ž。
Marc和kolstae在如何解決問題方面給出了很好的答案,但我認為值得解釋為什么你的原始代碼不起作用。
為了簡化問題,我傾向於將問題放在水果方面。 假設我們有:
List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());
如果這是允許的話,我們最終會在一堆香蕉中加入蘋果,這顯然是一件壞事。 那么,問題出在哪里? 第一行必須沒問題,第三行必須沒問題 - 你可以添加任何種類的水果到List<Fruit>
- 所以問題必須在第二行。 這是禁止的,正是為了避免這種問題。
這些幫助有用?
如果我理解正確,您應該聲明:
public class ZoneList<T extends Card> {
protected List<T> cardBox;
}
public class PokerHand extends ZoneList<PokerCard> {
public PokerHand() {
cardBox = new ArrayList<PokerCard>();
}
}
首先,使用getter / setter方法通常比直接訪問屬性更好,特別是如果你要進行大量復雜的繼承。
至於泛型問題,您可以嘗試在超類(或頂級接口/抽象類)中定義cardBox getter,如下所示:
protected ArrayList<? extends Card> getCardBox();
這樣你就可以在子類中挖掘它並讓它們返回任何類型的Card子類的列表。
一種方法是首先轉換為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>
ArrayList<? extends Card>
。 或者更好地使用List<? extends Card>
List<? extends Card>
為返回值,因為您可能無論如何都不依賴於ArrayList實現:
protected ArrayList<? extends Card> getCardBox();
至於您在評論中的問題,構造應該如您所述: List<? extends Card> list = new ArrayList<Card>();
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的訪問控制。 我從調試器聲明中得出的假設是它沒有標記,公共或受保護。 子類可以通過定義具有相同名稱的變量來“隱藏”它有權訪問的父類變量。 您還可以使用this
關鍵字引用特定對象實例和super
關鍵字來引用父關鍵字。
這是Java中基本訪問控制的一個很好的鏈接:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
您可能也會覺得有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.