如果你看一下执行
toArray(T[] a)的的ArrayList
public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a;}这种方法的问题是您需要传递相同泛型的数组。现在考虑如果此方法不带任何参数,则实现将类似于以下内容:
public <T> T[] toArray() { T[] t = new T[size]; // compilation error return Arrays.copyOf(elementData, size, t.getClass());}但是这里的问题是, 您不能在Java中创建通用数组, 因为编译器不知道确切
T代表什么。换句话说 , 在Java中不允许
创建非可校正类型的数组
(JLS§4.7)。
数组存储异常
(JLS§10.5)中的另一个重要报价:
如果数组的组件类型不可修改(第4.7节),则Java虚拟机将无法执行上一段所述的存储检查。
这就是为什么禁止使用不可修改元素类型的数组创建表达式的原因(第15.10.1节)。
这就是Java提供重载版本的原因
toArray(T[]a)。
我将重写toArray()方法以告诉它它将返回E数组。
因此
toArray(),您应该使用而不是覆盖
toArray(T[] a)。
无法从Java
Doc
创建类型参数的实例可能对您也很有趣。



