【发布时间】:2011-02-09 06:57:06
【问题描述】:
我无法理解以下文章: http://www.ibm.com/developerworks/java/library/j-jtp01255.html
下,
泛型不是协变的
作者说,
因为 ln 是一个 List,所以添加一个 浮动到它似乎完全合法。但 如果 ln 与 li 别名,那么它 会破坏类型安全承诺 隐含在 li 的定义中—— 它是一个整数列表,其中 这就是为什么泛型类型不能 协变。
我无法理解它所说的部分 “如果 ln 别名为 li”。作者所说的别名是什么意思?(参考?)。引用行上方的代码 sn-p 似乎说明了在 java 中什么是非法的,而不是为什么。如果有人可以举例说明,那对我很有帮助。 提前致谢。
【问题讨论】:
-
IIRC,泛型类型不是协变的,因为它们无法改变数组在以前版本的 Java 中的实现/使用方式(向后兼容),这是否对某人敲响了警钟?
-
@Skeptic,数组是协变泛型实现的一个例子——它会抛出运行时异常。 Java 无法做到这一点,因为泛型在运行时会被擦除,所以它只能通过限制协方差来控制它。
-
@Yishai,Steele 在名为“Growing a Language”的演示文稿中讨论了数组的问题,我现在似乎找不到。
-
IBM 链接似乎已失效,但在 Wayback Machine 上有一个副本:web.archive.org/web/20121104021805/http://www.ibm.com/…
-
@Skeptic 斯蒂尔演示文稿的书面版本没有提到阵列问题。不过,读起来还是很不错的。它位于cs.virginia.edu/~evans/cs655/readings/steele.pdf 或通过Wayback 机器web.archive.org/web/20131117030438/http://www.cs.virginia.edu/…
标签: java generics alias covariance