什么是泛型擦除啊,能说明一下吗!!

解决方案 »

  1.   

    Java泛型的悲哀啊,Java的泛型是使用擦除来实现的,擦除让很多东西都没有意义,或者说,在泛型代码内部,无法获得任何泛型参数类型的信息。
    举个例子
    ArrayList<String>和ArrayList<Integer>在程序运行的时候都是相同的类型,这两种类型都被擦除成了他们的原生类型ArrayList
      

  2.   

    JVM在实现泛型的时候是使用擦除功能来实现的,也就是JVM本身是不支持泛型的,比如:
    List<Integer> integer = new ArrayList<Integer>();
    这样的一段代码,针对调用者而言语法结构发生了改变,但是实际上针对JVM而言,它会去解析泛型语法,让后使它变成了原始版本:
    List integer = new ArrayList();
    这种情况就称为泛型的“擦除”,因为JVM本身不支持泛型,所以在实现的时候如同楼上的说的,这确实是Java泛型的悲哀,它没有真正使用泛型的标准原理实现JVM对泛型的编译,只是玩了个小小的花招
    主要原因是JVM在推出泛型的时候实际上并没有对JDK的编译器进行改写,所以使用了擦除功能,也就是说,针对JVM本身而言:
    上边两段代码都是一模一样的,没有区别,因为使用的“擦除”功能,在“擦除”过程里面,它会针对Java泛型的新语法进行类型检测操作,JVM本身不支持泛型,在编译器进行泛型代码的编译的时候,其实是使用了“擦除”功能,就是JVM在编译带泛型的代码的时候,实际上对带泛型的代码进行了类型检查,然后“擦除”泛型代码中的类型支持,转换为普通类型进行编译。这里有一个新概念成为“外露”类型——单独出现而不是位于某个类型中的类型参数如(List<T>中的T)针对T类型而言,T的上界就是Object。这一项技术的功能极其强大,我们可以使几乎所有泛型类型的精度增强,但是与JVM兼容。
    这是一个“擦除”的快照,具体原理你可以参考前段时间我整理的Blog:
    http://blog.csdn.net/silentbalanceyh/archive/2009/09/24/4586627.aspx