[英]generic wild card covariance and arraylist add function behaviour
EquilateralTriangle
是Triangle
的子类型。
List<? super EquilateralTriangle> equilateralTriangle =
new ArrayList<Triangle>(Arrays.asList(new Triangle(), new Triangle()));
equilateralTriangle.add(new Triangle()); // doesn't work
equilateralTriangle.add(new EquilateralTriangle()); // works
据我所知List<? super EquilateralTriangle>
List<? super EquilateralTriangle>
是声明,使用new ArrayList<Triangle>
告诉编译器一些具体的信息,我的arraylist是三角形类型。 那为什么编译器在第二行抱怨呢? 我要在实例化arraylist时插入与在定义的type参数中定义的值相同的值。
Java arraylist定义说明了这一点:
class ArrayList<E> extends AbstractList<E>
public ArrayList(Collection<? extends E> c)
和boolean add(E e);
对于ArrayList
。
因此,类型E
可以推断为Triangle
。 然后add
一定不要抱怨,因为我像在ArrayList
构造函数中那样传递了Triangle
。 我的理解中缺少什么?
看一下以下语句。 显然,添加字符串是可行的,而添加对象会导致编译时错误。
List<String> items = ...;
items.add(new String()); // works
items.add(new Object()); // error
现在,让我们在问题中使用通配符:
List<? super String> items = ...;
在此变量声明中, ?
代表未知数型 ,要么是字符串或基类字符串 。 无法推断/推断类型。 这只是一个未知类型 。 编译器必须假设,即? super String
? super String
可以是String
。 正如我们在上面看到的,不应将Objects添加到Strings列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.