Java 中为什么不能创建泛型数组?

之前只是知道在 Java 中不能创建泛型数组,今天翻看 《Effective Java》其中对这个部分有讲解,记录一下。

 

现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情况:

// 假设可以创建泛型数组
List<String>[] stringLists = new ArrayList<String>[1];
List<Integer> intList = Arrays.asList(42);
// 泛型擦除,List 继承自 Object,所以可以如此赋值
// 在数组中,子类数组 是 父类数组 的子类,Object[] o = new ArrayList[1];
Object[] objects = stringLists;
// 同理,泛型擦除后,List 类型变量赋值给 Object 类型变量
// 但此时出现问题了,**** List<Integer> 实例添加到了声明为 List<String>[] 类型的数组中了 ******
objects[0] = intList;
String s = stringLists[0].get(0);

由于泛型擦除,结果就是泛型的检查作用失效,可以将 List<Integer> 类型的值添加到 List<String>[] 类型的数组中。

而这类问题在编译时无法发现,只能在运行时出现问题

 

所以如果禁止创建泛型数组,就可以避免此类问题

 

 

另:

public class Main {

    static class A {}

    static class B extends A {}

    public static void main(String[] args) {
        A[] arraya = new A[5];
        B[] arrayb = new B[5];
        // 可以正常赋值,B[] 是 A[] 的子类
        arraya = arrayb;

        List<A> lista = new ArrayList<A>();
        List<B> listb = new ArrayList<B>();
        // lista = listb 编译错误,List<B> 不是 List<A> 的子类
    }
}

 

posted on 2018-03-04 16:40  _路上  阅读(5746)  评论(0编辑  收藏  举报

导航