• 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> 的子类
        }
    }
  • 相关阅读:
    定时器实现点击重新发送信息倒计时显示
    新浪微博5s钟后跳转页面
    时钟制作代码
    判断线段相交
    POJ1265:Area(多边形面积公式+pick公式) 好题
    ACM零散知识
    POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
    计算几何初步认识
    UVA10026:Shoemaker's Problem(贪心)
    UVA10020:Minimal coverage(最小区间覆盖)
  • 原文地址:https://www.cnblogs.com/zawier/p/8505098.html
Copyright © 2020-2023  润新知