zoukankan      html  css  js  c++  java
  • 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> 的子类
        }
    }
  • 相关阅读:
    开通博客开心
    Kubernetes/K8s架构师实战集训营【中、高级班】-2020
    Kubernetes/K8s CKA认证全套实训视频教程下载
    centos7安装部署docker
    模拟器genymotion的安装与配置
    工欲善其事必先利其器---Android开发环境搭建
    监控利器---Zabbix(一)
    进击python第4篇:初探模块
    fuser命令小结
    进击python第三篇:基础
  • 原文地址:https://www.cnblogs.com/zawier/p/8505098.html
Copyright © 2011-2022 走看看