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
,两个实现是Square
和Circle
。 现在,在对所需对象列表进行了一些特定设置之后,需要将它们全部添加到一起以将其发送到渲染function。 下面的代码应该使我所描述的内容更加清晰:
ArrayList squares = readSquares(); ArrayList circles = readCircles(); ArrayList queue= new ArrayList (squares); queue.addAll(circles); renderShapes(queue);
ArrayList(Collection extends E> c)
构造函数使第五行成为可能。 对于generics,处理器不够智能,无法自动确定Square默认扩展Shape。 你必须告诉编译器你的意图。 你这样做的方法是使用通配符 extends E>
extends E>
。 现在编译器将确保添加的每个对象至少是一个Shape。
当你为一个采用generics类的类构造一个对象时,这总是正确的。 如果向上滚动到顶部,您将看到Class ArrayList