比这还复杂的多:泛型以字节码删除,而的擦除
T[]为
Object[]。同样,的返回值
get()变为
Object。为了保持类型系统的完整性,在实际使用该类时即插入一个选中的强制类型转换,即
Integer i = list.get(0);
将被删除到
Integer i = (Integer) list.get(0);
在这种情况下,ArrayList中的任何类型检查都是多余的。但这确实不重要,因为
(T)和
(T[])都是 未经检查的
强制转换,并且不会产生运行时开销。
可以编写一个检查的ArrayList来执行以下操作:
T[] array = Array.newInstance(tClass, n);
这样可以防止 堆污染
,但要以冗余类型检查为代价(您不能抑制调用代码中的合成强制转换)。它还将要求调用者向ArrayList提供元素类型的类对象,这会使其api变得混乱,并使其更难在通用代码中使用。
编辑:为什么禁止通用数组创建?
一个问题是数组被检查,而泛型未被检查。那是:
Object[] array = new String[1];array[0] = 1; // throws ArrayStoreExceptionArrayList list = new ArrayList<String>();list.add(1); // causes heap pollution
因此,数组的组件类型很重要。我认为这就是为什么Java语言的设计师要求我们明确使用哪种组件类型。



