ArrayList(Collection c)

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

ArrayList l = new ArrayList(); 

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

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

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

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

 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable 

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

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

假设你有一组形状类。 基类是Shape ,两个实现是SquareCircle 。 现在,在对所需对象列表进行了一些特定设置之后,需要将它们全部添加到一起以将其发送到渲染function。 下面的代码应该使我所描述的内容更加清晰:

 ArrayList squares = readSquares(); ArrayList circles = readCircles(); ArrayList queue= new ArrayList(squares); queue.addAll(circles); renderShapes(queue); 

ArrayList(Collection c)构造函数使第五行成为可能。 对于generics,处理器不够智能,无法自动确定Square默认扩展Shape。 你必须告诉编译器你的意图。 你这样做的方法是使用通配符 。 现在编译器将确保添加的每个对象至少是一个Shape。

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