我写的例子:
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类型
相当于你在冰箱里面预留了一个位置放东西,但是你这个时候不知道是什么东西,你要用的时候,放水果,放盘子,放各种东西都行