日期:2014-05-20  浏览次数:20722 次

泛型的擦除
本帖最后由 yiqiu2324 于 2013-05-21 21:50:35 编辑
http://blog.csdn.net/lonelyroamer/article/details/7868820
在这篇博文中,作者详细讲了泛型.
但有个疑问,那就是使用了泛型的源文件在编译为字节码文件,源文件中的泛型(没有上限/下限)
会被擦除,并且所有的泛型变量会被替换为原始类型,那么内部如何发生强转?(由Object->指定类型?)
作者在谈这个说:
<摘自原话>
2、自动类型转换
  因为类型擦除的问题,所以所有的泛型类型变量最后都会被替换为原始类型。这样就引起了一个问题,既然都被替换为原始类型,那么为什么我们在获取的时候,不需要进行强制类型转换呢?看下ArrayList和get方法:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
    }


看以看到,在return之前,会根据泛型变量进行强转。假设泛型类型变量为Date,虽然泛型信息会被擦除掉,但是会将(E) elementData[index],编译为(Date)elementData[index]。所以我们不用自己进行强转。

编译为(Date)elementData[index]????
上面的方法E在编译后不是被替换成 Object 了....,也就是get 方法 的 E被替换成Object(原始类型)  
这个到底是为什么?类型被擦除替换为原始类型,到底怎么完成的强转动作?

疯狂java上一个例子:
import java.util.ArrayList;
import java.util.List;
public class RawTypeTest {

   public static void main(String[] args){
   
   List list=new ArrayList();
   list.add("ab");
   list.add("cd");
       List<Integer> intList=list;
      
       for(int i=0;i<intList.size();++i)
         System.out.println(intList.get(0));//这里为什么不会把类型转换异常?
     }                                      //返回类型为Integer,集合中的元素为String
 }
 public E get(int index) {
RangeCheck(index);
return (E) elementData[index];//执行到这个位置,不会发生类型转换异常吗?
    }

拜托了..


------解决方案--------------------
给你抄一段书吧,希望能够帮到你
java的泛型被称为伪泛型,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原生类型(Raw Type,也称裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的java语言来说,List<Integer>与List<String>就是一个类。所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。