2010-12-06 72 views
5

我知道,为了创建的ArrayList类型的对象,我需要:的ArrayList(收藏<? extends E> C)

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

我知道,因为我已经看到了这本书。

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

我不明白,我怎么会永远得到一个想法到指定的对象我的新ArrayList对象将持有的类型?我如何从这个定义知道我必须在实例化和变量声明期间指定<MyType>

+1

你在哪看,因为我看: “公众的ArrayList(收藏三)” – jzd 2010-12-06 19:23:27

+0

@jzd,这是什么OP把已经在这个问题.... – 2010-12-06 19:25:38

回答

3

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

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

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

4

该方法旨在将现有集合实例复制到新的ArrayList,而不是从头开始创建。它将接受的集合的元素有一个E类型的上界,它将成为你的新ArrayList的类型。

1

对于采用泛型类型的类构造对象时,总是如此。如果您向上滚动,您将看到Class ArrayList < E>。这是暗示。

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。

相关问题