- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我无法理解以下文章: http://www.ibm.com/developerworks/java/library/j-jtp01255.html
下,
Generics are not covariant
作者说,
Because ln is a List, adding aFloat to it seems perfectly legal. Butif ln were aliased with li, then itwould break the type-safety promiseimplicit in the definition of li --that it is a list of integers, whichis why generic types cannot becovariant.
我无法理解它所说的部分“如果 ln 别名为 li”。作者所说的别名是什么意思?(引用?)。引用行上方的代码片段似乎说明了 java 中什么是非法的,而不是为什么。如果有人可以举例说明,那对我很有帮助。提前致谢。
最佳答案
List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));
在 Java 中,整数继承自 Number (java.lang.Number)
,如此直观,任何整数 (java.lang.Integer)
也是一个数字,但那篇文章指出的是,对于泛型,它不能以这种方式工作,因为考虑到这个例子,你最终可能会将一个 float (它是一个数字)放入 List<Integer>
,这是非法的,因为 float 不是整数。
结论:泛型不是协变的。
注意:我推荐你阅读Effective Java (2nd Edition) Chapter 5: Generics。
关于java泛型协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660827/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!