zoukankan      html  css  js  c++  java
  • 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中泛型和数组可谓水火不相容。
    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [GEiv]第七章:着色器 高效GPU渲染方案
    Cocos2d-x 脚本语言Lua介绍
    TestNg依靠先进的采用强制的依赖,并依赖序列的------TestNg依赖于特定的解释(两)
    uboot通过使用U磁盘引导内核RT5350成功
    linux下一个rsync工具和配置
    STM32 模拟I2C (STM32F051)
    Something write in FSE 2014
    ESB (Enterprise Service Bus) 入门
    Spring框架:Spring安全
    “TNS-03505:无法解析名称”问题解决一例
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4618978.html
Copyright © 2011-2022 走看看