本帖最后由 yiqiu2324 于 2013-05-21 21:50:35 编辑

解决方案 »

  1.   

    刚好我看了java语法糖部分知识,类型擦出属于一种语法糖,所谓语法糖,指添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
    以下为你那段代码编译为class文件,再反编译出来的代码,即为类型擦出后的代码。可以看到第10行,List<Integer> intList=list;经过类型擦除后已经变成了List intList = list;
    import java.io.PrintStream;
    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 intList = list;    for (int i = 0; i < intList.size(); ++i)
          System.out.println(intList.get(i));
      }
    }而List list = new ArrayList();在执行了这一句之后,list的类型估计应该默认是Object了,而在赋值给intList后,类型是不会变得,所以以下代码估计在执行的会是下面那段代码
     public E get(int index) {
        RangeCheck(index);
        return (E) elementData[index];//执行到这个位置,不会发生类型转换异常吗?
        }
    public Object get(int index) {
        RangeCheck(index);
        return (Object) elementData[index];//执行到这个位置,不会发生类型转换异常吗?
        }
    这只是我的理解,有不对的地方,请大家指出
      

  2.   

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

  3.   

    理解的很对,昨晚我在翻看:java核心技术的泛型部分,感觉清晰很多.
    intList.get(i)//泛型擦除后->返回为Object
    但是如果这样
    Integer in=inList.get(i)//发生String can not cast Integer谢谢了
      

  4.   

    有了泛型,编译器编译的时候,会比较E.getClass()和obj.getClass(),如果不相同就报编译错误。编译通过了,将<E>擦除也不会有问题。