【发布时间】:2020-03-20 16:06:57
【问题描述】:
我了解 PECS(生产者扩展,消费者超级)的概念,但仍然对这些符号感到困惑:
public class PECSTest {
public static void main(String[] args) {
//List<? extends Object> ProducerList = new ArrayList<String>();
//ProducerList.add("1"); // Line 1 :compileTimeError
PECSTest myTest = new PECSTest();
List<String> myList = new ArrayList<String>();
myList.add("abc");
myTest.printMyList(myList);
}
private void printMyList(List<? extends Object> myList) {
// TODO Auto-generated method stub
int i=0;
while(i<myList.size()) {
System.out.println(myList.get(i).getClass()); //Line 2
System.out.println(myList.get(i).charAt(0)); // Line 3
System.out.println(myList.get(i).equals(new String("abc")));
i++;
}
}
}
- 即使我创建了一个列表,它可以接受任何扩展 Object 类的对象,但是当我尝试添加字符串时,它在第 1 行给出了编译时错误。为什么?
- 在第二种情况下,当我将 List 传递给 printMyList 方法时,它会在第 2 行打印 String 中的每个元素类类型,但在第 3 行,为什么我无法调用任何 String 类特定方法,例如 charAt。还有为什么不需要对 String 进行强制转换。
还有消费者
List<? super Number> myList = new ArrayList<Object>();
myList.add(new Object());// compile time error
为什么我不能在 myList 中添加对象。因为如果我们使用 super 这意味着这个列表可以包含等于和高于 Java 类层次结构中的数字的对象。所以 new Object() 应该根据该语句添加到列表中。
谢谢。
【问题讨论】:
-
你不能像
new Object()一样实例化一个“通用”Object -
为什么在
Number(List<? super Number>) 上使用下界通配符?可能是List<? extends Number>允许Number的每个子类,而不是每个不是数字的对象...
标签: java generics wildcard pecs