簡體   English   中英

的ArrayList(收藏 <? extends E> C)

[英]ArrayList(Collection<? extends E> c)

我知道為了創建ArrayList類型的對象,我需要:

ArrayList<MyType> l = new ArrayList<MyType>();

我知道,因為我在書中看到了這一點。

但是看看ArrayList構造函數的Java SE API,我看到: ArrayList(Collection<? extends E> c)

我不明白,我怎么會想到指定我的新ArrayList對象將包含的對象類型? 我如何從這個定義中知道我必須在實例化和變量聲明期間指定<MyType>

該方法旨在將現有集合實例復制到新的ArrayList,而不是從頭開始創建。 它將接受的集合的元素具有類型E的上限,然后它將是新ArrayList的類型。

為了找出你的聲明中是否需要類型參數,你不要看構造函數,你看一下類定義本身 構造函數的參數與對象本身的類型無關 - 構造函數可以采用任何類型的參數,就像任何其他方法一樣。 這是類定義:

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

class ArrayList<E>部分表示有一個名為ArrayList的類,它需要一個類型參數(這里稱為E)。

假設你有一組形狀類。 基類是Shape ,兩個實現是SquareCircle 現在,在對所需對象列表進行了一些特定設置之后,需要將它們全部添加到一起以將其發送到渲染功能。 下面的代碼應該使我所描述的內容更加清晰:

ArrayList<Square> squares = readSquares();
ArrayList<Circle> circles = readCircles();

ArrayList<Shape> queue= new ArrayList<Shape>(squares);
queue.addAll(circles);

renderShapes(queue);

ArrayList(Collection<? extends E> c)構造函數使第五行成為可能。 對於泛型,處理器不夠智能,無法自動確定Square默認擴展Shape。 你必須告訴編譯器你的意圖。 你這樣做的方法是使用通配符<? extends E> <? extends E> 現在編譯器將確保添加的每個對象至少是一個Shape。

當你為一個采用泛型類的類構造一個對象時,這總是正確的。 如果向上滾動到頂部,您將看到Class ArrayList <E>。 這是暗示。

暫無
暫無

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

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