【发布时间】:2018-10-31 18:28:35
【问题描述】:
我尝试理解泛型中的通配符,但我有疑问
List<? super Number > 可以引用任何对象列表并将任何对象扩展编号添加到此列表中,但我不能添加到其中对象不扩展编号(字符串)
但是为什么我可以在这段代码中做到这一点而在运行时没有任何编译错误或异常(指列表包含字符串对象)
编辑:我想了解的是泛型提供了安全的编译时间,而这在我的示例中没有实现
List <? super Object> objectList = new ArrayList<>();
objectList.add("str1");
List<? super Number> numberList = objectList;
numberList.add(1);
objectList.add("str2");
for (int i = 0; i < objectList.size(); i++) {
System.out.println(objectList.get(i) + "");
}
【问题讨论】:
-
我猜如果您执行
numberList.get(i) + ""之类的操作,您会遇到问题。您在循环中使用objectList,所以我不认为会有问题。 -
哎呀我想不出它的正确名称,但实际上边界的方向在这里很重要。但是类型“检查”是在检索时完成的,而不是在您插入对象列表时(无论如何都会通过
Object类型检查)。 -
@Rogue PECS?
-
List<? super SomeType>只允许您添加数据(参见What is PECS (Producer Extends Consumer Super)?)。那么为什么让List<? super Number>处理List<? super Object>会不安全呢?如果我们知道List<? super Object>持有对象列表,那么将 Integer 添加到它应该不是问题,因为持有的List<Object>(或 List- 如果可能的话)将被声明为持有 Object (包括它的子类型) .