范型中,List<String> l = new ArrayList<String>(); 
其中List<String> l决定了l只能接受String类型的参数,那么ArrayList<String>()代表了什么?我们知道new ArrayList默认初始化10个长度的Object数组,难道new ArrayList<String>()就初始化10个长度的String[]?可是运行如下代码: List l = new ArrayList<String>(); 
l.add(new Integer(1)); 
System.out.println(l.get(0)); 程序能照常运行,说明l对象里没有实例化一个10个长度的String[],否则会报类型不匹配的错误,那ArrayList<String>()代表了什么?

解决方案 »

  1.   

    Java tutorial里面有一个叫做type erasure的概念,就是说在编译后会去掉所有的类型信息.
    List l = new ArrayList <String>();  实际上就变成了 List l = new ArrayList <Object>();
    个人认为泛型的主要功能就是:由于在编译时就定义类型,从而减少了在运行期间的错误.
      

  2.   

    类型擦除之后,你编译后的Class文件,原先的类型变量都用object类型替换。
      

  3.   

    那是不是可以得出结论:
    List<String> l 有意义,但是new ArrayList<String>()加不加范型没区别
      

  4.   

    “难道new ArrayList <String>()就初始化10个长度的String[]?”
    并没有初始化String[], 初始化的仍然是Object[]ArrayList类的初始化代码如下:
    private E[] elementData;
    ......
    this.elementData = (E[])new Object[initialCapacity];
    虽然做了类型转换,实际仍然是Object[]型的
      

  5.   

    也不能完全这么说.根据代码,所有的操作都是围绕着l的,申明成List<String>以后l只能对于String操作.所以List<String> l是有意义的.
    但一不能说ArrayList<String>是完全无意义的,加泛型<String>就是为了避免在运行期间减少类型不匹配的错误.
    List<String> l = new ArrayList();
    也能通过编译,但会有warning.和使用List l = new ArrayList()没什么区别,这样就失去了使用List<String>的意义.
      

  6.   

    但一不能说ArrayList <String>是完全无意义的,加泛型 <String>就是为了避免在运行期间减少类型不匹配的错误. 可是事实是没有起到这个作用啊,不如你举段代码作为例子,看看new ArrayList <String>()和new ArrayList()比,到底带来了哪些便利
      

  7.   

    应该是编译时类型检查。以及表达上的便利。
    ArrayList<String> list = new ArrayList<String>();
    // list.put(1);//ERROR
    list.put("hello");
    String s = list.get(0); //不需要再做类型转换
    详见Thinking in java泛型一章的总结,是作者对泛型的思考。
      

  8.   

    List   l = new ArrayList <String>(); 跟没用泛型一样了
    new了一个ArrayList<String>对象 给了个List类型引用  
    ArrayList的add方法源码
    public boolean add(E o) {
    ensureCapacity(size + 1);  // Increments modCount!!
    elementData[size++] = o;
    return true;
        }
    list的<E>是没有赋值的应该是转成Object了.
      

  9.   

    对于<String>意义不大,因为所有对象都可以自动装换到String.
    对于你自己定义的对象,就可以省略强制转换的写法。