• Java数组与泛型


    Java中不能创建泛型数组,例如不能这样写:
    [java] view plaincopy
    ArrayList<String>[] as = new ArrayList<String>[10];

    原因是:
    Java中的泛型并不像C++那样会在编译时实例化成具体的类,或者说Java中的泛型是“伪泛型”。对于一个泛型,程序无法获得它的具体的参数类型,也就是说:
    [java] view plaincopy
    ArrayList<String> a = new ArrayList<String>();

    声明a之后,你没法检查a的类型是ArrayList<String>还是ArrayList<Integer>,只能知道a是ArrayList的一个实例化对象。如下代码:
    [java] view plaincopy
    System.out.println(a.getClass().toString());
    System.out.println(Arrays.toString(a.getClass().getTypeParameters()));

    得到的输出信息是:
    class java.util.ArrayList
    [E]
    可以看出,获得a的具体类型的企图落空了。
    泛型的这种机制在Java中叫做擦除。即,泛型的具体类型信息会被擦除到它的原生类型或者类型边界。类型边界是Java泛型的另一个特性:
    [java] view plaincopy
    class Temp<T extends Par>
    {...}

    Temp是泛型的名字,Par是边界类的名字。在定义一个泛型的时候,可以通过extends关键词来指定T的导出类型(T的父类),擦除的时候,会擦除到边界,即Par。
    而Java中的数组必须知道它所持有的确切类型。
    数组名是一个标识符,是一个指向堆栈中的数组对象的引用。如果是基本数据类型的数组,那么这个数组对象中存放着length等信息以及各个元素的值,如果是引用类型的数组,那么这个数组对象中存放着length等信息以及各个元素的引用。数组在定义时就必须有确切的类型,所有存入数组的元素都必须转化成数组的类型。所以Java中泛型和数组可谓水火不相容。
    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    JAVA中重写equals()方法为什么要重写hashcode()方法说明
    深入浅出UML类图
    UML解惑:图说UML中的六大关系
    maven自动打包上传nexus仓库配置
    vi查找替换命令详解
    Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)
    Maven 排除依赖jar包
    2、【Spark】Spark环境搭建(集群方式)
    1、【Spark】Spark安装
    Centos7 执行firewall-cmd –permanent –add-service=mysql报错“ModuleNotFoundError: No module named 'gi'”
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4618978.html
Copyright © 2020-2023  润新知