猿问

java泛型协方差

java泛型协方差

我无法理解以下文章:http: //www.ibm.com/developerworks/java/library/j-jtp01255.html

下,

泛型不是协变的

作者说,

因为ln是一个List,所以添加一个Float似乎是完全合法的。但是如果ln与li混淆,那么它将破坏li定义中隐含的类型安全承诺 - 它是一个整数列表,这就是泛型类型不能协变的原因。

我无法理解它所说的“如果ln与li混淆”的部分。作者对别名的含义是什么?(参考?)。引用行上方的代码片段似乎说明了什么在java中是非法的而不是为什么。如果有人能用一个例子来解释,对我来说会很有帮助。提前致谢。


一只萌萌小番薯
浏览 406回答 3
3回答

皈依舞

List<Integer>&nbsp;li&nbsp;=&nbsp;new&nbsp;ArrayList<Integer>();List<Number>&nbsp;ln&nbsp;=&nbsp;li;&nbsp;//&nbsp;illegalln.add(new&nbsp;Float(3.1415));在Java中,Integer继承自Number&nbsp;(java.lang.Number),因此直观地说,任何Integer&nbsp;(java.lang.Integer)都是一个数字,但是那篇文章指出的是,泛型它不能以这种方式工作,因为考虑到这个例子,你最终会放一个浮点数(这是一个数字)成a&nbsp;List<Integer>,这是非法的,因为float不是整数。结论:泛型不是协变的。注意:我建议您阅读Effective Java(第2版)第5章:泛型。

小唯快跑啊

如果你能做这样的事情:List<Float>&nbsp;foo;List<Object>&nbsp;bar;foo&nbsp;=&nbsp;new&nbsp;ArrayList<Float>();bar&nbsp;=&nbsp;foo;foo.add(1.0f);bar.add("Hello");事情会非常错误。在这个例子中,bar是foo的别名,如果你能做到这一点,你将失去类型安全性,这是泛型存在的主要原因。

芜湖不芜

public&nbsp;class&nbsp;vechicle&nbsp;{void&nbsp;drive(){}}class&nbsp;car&nbsp;extends&nbsp;vechicle{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Covariance &nbsp;&nbsp;&nbsp;&nbsp;vechicle&nbsp;getObject(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;car(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//contravariance &nbsp;&nbsp;&nbsp;&nbsp;car&nbsp;getmyObject(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(car)&nbsp;new&nbsp;vechicle();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答