iterator的泛型怎么理解

我写的例子:

 List<String> str = new ArrayList<String>();
        str.add("11");
        List list = str;
        list.add(2);
        System.out.println(str);

ArrayList调用的toString方法:

 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            //String s = (String)e;
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

toString中的E不是代表String吗,System.out.println(str)这句话为什么不报错呢,
加上注释掉的 //String s = (String)e;就报类型转换异常,为什么会这样?

1.既然你的List已经指明了类型为String,为什么还要对迭代器指定为E.

2.E是一个标记符,并不是真正意义上的类,使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换

因为这一句
List list = str;
list.add(2);
这边加入的是integer类型

相当于你在冰箱里面预留了一个位置放东西,但是你这个时候不知道是什么东西,你要用的时候,放水果,放盘子,放各种东西都行