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>?
这是一个非常普遍的误解.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对象不是类型安全的.
现在,你不能添加的事实并不意味着你不能做其他有用的东西,比如获得大小等.
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |