繁体   English   中英

的ArrayList(收藏 <? extends E> C)

[英]ArrayList(Collection<? extends E> c)

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

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

我知道,因为我在书中看到了这一点。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM