[英]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
,兩個實現是Square
和Circle
。 現在,在對所需對象列表進行了一些特定設置之后,需要將它們全部添加到一起以將其發送到渲染功能。 下面的代碼應該使我所描述的內容更加清晰:
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.