soo*_*y42 20 java generics alias covariance
我无法理解以下文章:http: //www.ibm.com/developerworks/java/library/j-jtp01255.html
下,
泛型不是协变的
作者说,
因为ln是一个List,所以添加一个Float似乎是完全合法的.但是如果ln与li混淆,那么它将破坏li定义中隐含的类型安全承诺 - 它是一个整数列表,这就是泛型类型不能协变的原因.
我无法理解它所说的"如果ln与li混淆"的部分.作者对别名的含义是什么?(参考?).引用行上方的代码片段似乎说明了什么在java中是非法的而不是为什么.如果有人能用一个例子来解释,对我来说会很有帮助.提前致谢.
bak*_*kal 41
List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));
Run Code Online (Sandbox Code Playgroud)
在Java中,Integer继承自Number (java.lang.Number),因此直观地说,任何Integer (java.lang.Integer)都是一个数字,但是那篇文章指出的是,泛型它不会那样工作,因为考虑到这个例子,你最终会放一个浮点数(这是一个数字)成a List<Integer>,这是非法的,因为float不是整数.
结论:泛型不是协变的.
注意:我建议您阅读Effective Java(第2版)第5章:泛型.
如果你能做这样的事情:
List<Float> foo;
List<Object> bar;
foo = new ArrayList<Float>();
bar = foo;
foo.add(1.0f);
bar.add("Hello");
Run Code Online (Sandbox Code Playgroud)
事情会非常错误.在这个例子中,bar是foo的别名,如果你能做到这一点,你将失去类型安全性,这是泛型存在的主要原因.
| 归档时间: |
|
| 查看次数: |
11136 次 |
| 最近记录: |