ArrayList(Collection <! - ?extends E - > c)

时间:2010-12-06 19:20:31

标签: java api

我知道为了创建ArrayList类型的对象,我需要:

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

我知道,因为我在书中看过这个。

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

我不明白,我怎么会想到指定我的新ArrayList对象会包含的对象类型?我如何从这个定义中知道我必须在实例化和变量声明期间指定<MyType>

4 个答案:

答案 0 :(得分:4)

该方法旨在将现有的集合实例复制到新的ArrayList,而不是从头开始创建。它将接受的集合的元素具有类型E的上限,然后它将是新ArrayList的类型。

答案 1 :(得分:3)

为了找出你的声明中是否需要类型参数,你不要看构造函数,你看class definition itself。构造函数的参数与对象本身的类型无关 - 构造函数可以采用任何类型的参数,就像任何其他方法一样。这是类定义:

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

class ArrayList<E>部分说有一个名为ArrayList的类,它需要一个类型参数(这里称为E)。

答案 2 :(得分:2)

假设你有一组形状类。基类为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>。现在编译器将确保添加的每个对象至少是一个Shape。

答案 3 :(得分:1)

当你为一个采用泛型类的类构造一个对象时,这总是正确的。如果向上滚动到顶部,您将看到Class ArrayList&lt; E>。这是暗示。