如果你看一下执行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());
}
但是这里的问题是, 因为编译器不知道确切T
代表什么。换句话说 (JLS§4.7)。
如果数组的组件类型不可修改(第4.7节),则Java虚拟机将无法执行上一段所述的存储检查。 这就是为什么禁止使用不可修改元素类型的数组创建表达式的原因(第15.10.1节)。
这就是Java提供重载版本的原因toArray(T[] a)
。
我将重写toArray()方法以告诉它它将返回E数组。
因此toArray()
,您应该使用而不是覆盖toArray(T[] a)
。