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)
这是什么原因?
Number object
不起作用,因为编译器不知道这numbers
是一个Number
s 列表- 它只知道它是一个超类的列表Integer
.所以它可能是一个Object
例如s 的列表,在这种情况下,将结果存储get
在Number
变量中是行不通的.因此编译器不允许它.
Object object
被允许的,因为存储的结果get
在一个Object
变量总是可行的,因为你可以存储在任何Object
变量.
numbers.add( new Object() )
不起作用的原因是你只允许向Object
s 添加s List<Object>
,但numbers
很可能是a List<Integer>
或a List<Number>
(实际上它是后者),所以这是不允许的.
基本上你必须这样想:它numbers
可以是一个Integer
s 列表,一个s列表Number
或一个Object
s 列表,所以你只能执行那些对这三个中的任何一个都有效的行为.
归档时间: |
|
查看次数: |
109 次 |
最近记录: |