我对java中的泛型编程有一些困惑:
如果Manager是Employee子类,
Collection<Manager> managers=new Collection<Manager>;
Collection<Employee> employees=managers;//why illegal?为什么最后一条语句是非法的?
因为根据CORE JAVA一书中的说明,经过擦除后,Collection<Manager>和Collection<Employee>都被转换为原始类型Collection。
发布于 2009-11-29 21:52:18
如果上述情况属实,那么您可以将您的经理集合视为员工集合,然后将任何员工放入经理集合(即,不仅仅是经理,而是(比方说)毕业实习生、CIO等)。
这有点违反直觉。橙色的水果是一种。橙子列表不是水果的列表(否则您可以在其中放一个苹果)。在Java Generics教程中有一个concise explanation。
发布于 2009-11-29 22:20:27
这称为covariance and contravariance。您刚刚发现的问题是一个传统的类型系统问题。相应的wikipedia page用Java语言讨论了这个问题。花一些时间来正确理解这些问题是值得的,因为它也与方法覆盖有关(因为JDK5,您确实可以更改被覆盖方法的return type,只要它是协变的)。
发布于 2009-11-29 21:52:56
想象一下你的代码是合法的。(让Apple成为Fruit的子类)
Collection<Fruit> apples = { new Apple() };
Collection<Apple> fruit = apples;
fruit.add(new Banana()); // Inserting a banana into a list of apples
// Breaks type safetyhttps://stackoverflow.com/questions/1815586
复制相似问题