使用super的泛型代码无法按预期工作

fas*_*ava 4 java compiler-construction generics type-conversion

我有以下代码:

List<? super Integer> numbers = new ArrayList<Number>();
numbers.add(new Integer(10));
Number object = numbers.get(0);  //this doesn't compile??

Object object = numbers.get(0);  //this does compile
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

numbers.add(new Object()); //doesn't compile in contradiction to above statement
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

sep*_*p2k 9

Number object不起作用,因为编译器不知道这numbers是一个Numbers 列表- 它只知道它是一个超类的列表Integer.所以它可能是一个Object例如s 的列表,在这种情况下,将结果存储getNumber变量中是行不通的.因此编译器不允许它.

Object object被允许的,因为存储的结果get在一个Object变量总是可行的,因为你可以存储在任何Object变量.

numbers.add( new Object() )不起作用的原因是你只允许向Objects 添加s List<Object>,但numbers很可能是a List<Integer>或a List<Number>(实际上它是后者),所以这是不允许的.

基本上你必须这样想:它numbers可以是一个Integers 列表,一个s列表Number或一个Objects 列表,所以你只能执行那些对这三个中的任何一个都有效的行为.