簡體   English   中英

在Java中使用ArrayLists進行轉換

[英]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

您可能也會覺得有幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM