【发布时间】:2021-03-30 19:01:16
【问题描述】:
假设我们有两个类 Parent 和 Child:
public class Parent {
}
public class Child extends Parent {
}
我们有以下参数的方法:
public void foo(List<Parent> list) {
...
}
我的问题为什么遵循方法参数是非法的(案例 A)
List<Child> list = List.of(new Child());
foo(list); //compile error
但同时这种情况是有效的(情况B)
foo(List.of(new Child());
List.of() 有这样的签名static <E> List<E> of(E... elements),所以我希望
List.of(new Child()) 的类型为 List<Child> 并且因为 this wildcard rule(List<Child> 不扩展 List<Parent>) 我认为这两种情况都不能编译。
但是为什么案例 B 会编译?编译器看到,List.of(new Child()) 没有显式类型,并检查列表的每个项目是否可以转换为 Parent.class 并这样做以获得正确的类型?
【问题讨论】:
-
只需这样做而不是案例 B: List
plist = List.of(new Child());富(plist);走着瞧吧?与您的情况 B 相同-但明确。虽然您的案例 A 将列表的类型设置为 sth。不同的。顺便提一句。你没有一个函数,而是一个方法 foo。 -
将您的方法签名更改为
foo(List<? extends Parent> list)以接受 Parent 的后代。 -
@juwil 和我想的一样,谢谢!