我知道为了创建ArrayList类型的对象,我需要:
ArrayList<MyType> l = new ArrayList<MyType>();
我知道,因为我在书中看过这个。
但是看看ArrayList构造函数的Java SE API,我看到:
ArrayList(Collection<? extends E> c)
我不明白,我怎么会想到指定我的新ArrayList对象会包含的对象类型?我如何从这个定义中知道我必须在实例化和变量声明期间指定<MyType>
?
答案 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
,两个实现为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>
。现在编译器将确保添加的每个对象至少是一个Shape。
答案 3 :(得分:1)
当你为一个采用泛型类的类构造一个对象时,这总是正确的。如果向上滚动到顶部,您将看到Class ArrayList&lt; E>。这是暗示。