您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

ArrayList.toArray()中的Java泛型

ArrayList.toArray()中的Java泛型

如果你看一下执行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)。

JLS§10.5)中的另一个重要报价:

如果数组的组件类型不可修改(第4.7节),则Java虚拟机将无法执行上一段所述的存储检查。 这就是为什么禁止使用不可修改元素类型的数组创建表达式的原因(第15.10.1节)。

这就是Java提供重载版本的原因toArray(T[] a)

我将重写toArray()方法以告诉它它将返回E数组。

因此toArray(),您应该使用而不是覆盖toArray(T[] a)

无法从Java Doc创建类型参数的实例可能对您也很有趣。

java 2022/1/1 18:36:45 有379人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶