将子类型集合分配给父类型

时间:2018-05-09 13:29:42

标签: java inheritance collections casting

以下代码不会出现任何错误:

Class2

那么为什么下面会给出错误:

Class1

2 个答案:

答案 0 :(得分:1)

B延伸A并不意味着List<B>延伸List<A>。将子类型集合分配给父类型将使其不是类型安全的。

List<B> ListB = new LinkedList<B>();
List<A> ListA = ListB ;  // Suppose you can compile it without error
ListA.add(new C());  // You can put C into ListA if C extends A
B b = ListB.get(0); // Then when you retrieve from ListB, you get a C, not type safe!

您需要一个通配符来保证类型安全并使其编译:

List<B> ListB = new LinkedList<B>();
List<? extends A> ListSubA = ListB ;
ListSubA.add(new C()); // Compile error, a wildcard can prevent user putting C into it
ListB.add(new B());  // You can only add new element by ListB 
B b = ListB.get(0);  // Type safe

答案 1 :(得分:1)

这里解释了 - https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

基本上List<A>被视为List<B>的单独(不相关)类型,因此当您声明类型为List<A>的引用时,它不能指向类型为{的对象{1}}。

这里有一个很好的讨论 - Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?