首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的泛型编程

java中的泛型编程
EN

Stack Overflow用户
提问于 2009-11-29 21:46:50
回答 13查看 861关注 0票数 2

我对java中的泛型编程有一些困惑:

如果Manager是Employee子类,

代码语言:javascript
复制
Collection<Manager> managers=new Collection<Manager>;  
Collection<Employee> employees=managers;//why illegal?

为什么最后一条语句是非法的?

因为根据CORE JAVA一书中的说明,经过擦除后,Collection<Manager>Collection<Employee>都被转换为原始类型Collection

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-11-29 21:52:18

如果上述情况属实,那么您可以将您的经理集合视为员工集合,然后将任何员工放入经理集合(即,不仅仅是经理,而是(比方说)毕业实习生、CIO等)。

这有点违反直觉。橙色的水果是一种。橙子列表不是水果的列表(否则您可以在其中放一个苹果)。在Java Generics教程中有一个concise explanation

票数 11
EN

Stack Overflow用户

发布于 2009-11-29 22:20:27

这称为covariance and contravariance。您刚刚发现的问题是一个传统的类型系统问题。相应的wikipedia page用Java语言讨论了这个问题。花一些时间来正确理解这些问题是值得的,因为它也与方法覆盖有关(因为JDK5,您确实可以更改被覆盖方法的return type,只要它是协变的)。

票数 3
EN

Stack Overflow用户

发布于 2009-11-29 21:52:56

想象一下你的代码是合法的。(让Apple成为Fruit的子类)

代码语言:javascript
复制
Collection<Fruit> apples = { new Apple() };
Collection<Apple> fruit = apples;

fruit.add(new Banana()); // Inserting a banana into a list of apples
                         // Breaks type safety
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1815586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档