以下代码不会出现任何错误:
Class2
那么为什么下面会给出错误:
Class1
答案 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?