使用中间通配符从List <B强制将A>扩展到List <A>-安全吗?

时间:2019-07-11 12:33:43

标签: java casting unbounded-wildcard

我注意到以下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?的回答是:“您不能像那样抛弃它。”

我的问题是-为什么能够进行投射以及这种投射的结果是什么?

0 个答案:

没有答案