泛型和继承?

M S*_*ach 3 java generics

public static void main(String... args) {
    List<Child> list1 = new ArrayList<Child>();
    method2(list1);
}

public static void method2(List<Parent> list1) {
}   
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误

方法method2(List)未定义...

上面的问题可以通过修改List<Parent> list1来解决List<? extends Parent> list1.

但是如果我尝试添加下面的子对象

public static void method2(List<? extends Parent> list1) {
    Child child1 = new Child();
    list1.add(child1);
}
Run Code Online (Sandbox Code Playgroud)

它再次出现编译错误

类型List中的方法add(capture#1-of?extends Parent)不适用于参数(Child)

所以我的问题是,如果List<Child>可以作为参数传递给List<? extends Parent> list1我们为什么不能添加子对象List<? extends Parent>

Dan*_*don 6

这是一个非常普遍的误解.Child扩展Parent的事实不会List<Child>扩展List<Parent>.在像这样的情况下听起来非常不直观,但确实如此.来自java教程:

给定两个具体类型A和B(例如,Number和Integer),MyClass <A>与MyClass <B>无关,无论A和B是否相关.MyClass和MyClass的公共父是Object.

阅读本文了解详情.

至于添加到列表,简短的答案是:想象一下,你有另一个class Child2 extends Parent,现在,你作为参数接收的列表method2(List<? extends Parent> list1)可以是a List<Child1>或a List<Child2>.因此,鉴于第二种情况是可能的,添加Child1对象不是类型安全的.

现在,你不能添加的事实并不意味着你不能做其他有用的东西,比如获得大小等.