我注意到以下Java行为,这使我有些困惑:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
new Test().test();
}
public void test() {
List<B> b = new ArrayList<>();
b.add(new B());
// doesn't compile
// List<A> a = (List<A>) b;
List<A> a = (List<A>) (List<? extends A>) b;
System.out.println(a.get(0));
}
private static class A {
@Override
public String toString() {
return "A{}";
}
}
private static class B extends A{
@Override
public String toString() {
return "B{}";
}
}
}
它会打印B{}
。
如果我有List<B extends A>
,并且想调用一个期望List<A>
的方法是否安全,或者不像上面的示例那样进行强制转换?
为什么Java禁止(List<A>)
,但允许(List<A>) (List<? extends A>)
?
对类似问题Java: Casting from List<B> to List<A> when B implements A?的回答是:“您不能像那样抛弃它。”
我的问题是-为什么能够进行投射以及这种投射的结果是什么?