java - 可以使 java.util.ArrayList<T>.toArray() 更友好吗?

标签 java arraylist collections

我对使用 java.util.ArrayList.toArray() 的痛苦感到惊讶。

假设我将数组列表声明为:

java.util.ArrayList<double[]> arrayList = new java.util.ArrayList<double[]>();
... add some items ...

然后要将其转换为数组,我必须执行以下操作之一:

double[][] array = (double[][])arrayList.toArray(new double[0][]);

或:

double[][] array = (double[][])arrayList.toArray(new double[arrayList.size()][]);

或:

double[][] array = new double[arrayList.size()];
arrayList.toArray(array);

以上都不是可读性很强的。难道我不能说下面的话吗?

double[][] array = arrayList.toArray();

但这会导致编译错误,因为 Object[] 无法转换为 double[][]。

也许这是不可能的,因为 toArray 必须返回 Object[] 为了与模板前的日子向后兼容。 但如果是这样的话,就不能添加更友好的替代方法吗 用不同的名字?我想不出一个好名字,但几乎任何东西 会比现有的方式更好;例如以下内容没问题:

double[][] array = arrayList.toArrayOfNaturalType();

不存在这样的成员函数,但也许可以编写一个通用的辅助函数来完成它?

double[][] array = MyToArray(arrayList);

MyToArray 的签名类似于:

public static <T> T[] MyToArray(java.util.ArrayList<T> arrayList)

是否可以实现这样的功能? 我在实现它时的各种尝试导致了编译错误 “错误:创建通用数组”或“错误:无法从类型变量中选择”。

这是我能得到的最接近的:

public static <T> T[] MyToArray(java.util.ArrayList<T> arrayList, Class type)
{
    T[] array = (T[])java.lang.reflect.Array.newInstance(type, arrayList.size());
    arrayList.toArray(array);
    return array;
}

它的名字是这样的:

double[][] array = MyToArray(arrayList, double[].class);

我希望没有多余的最终参数,但是,即便如此, 我认为这是迄今为止我见过的将数组列表转换为数组的最不可怕的方法。

有没有可能做得比这更好?

最佳答案

Is it possible to do any better than this?

没有。

None of the above are very readable. Shouldn't I be able to say the following instead?

double[][] array = arrayList.toArray();

这会很好......但你不能。

问题是 toArray() 方法是在 Java 1.2 中指定的,具有您所看到的行为。直到 Java 1.5 才将泛型类型添加到该语言中。添加它们时,设计人员选择了“类型删除”方法,以与早期版本的 Java 兼容。所以:

  • toArray() 方法的语义不能在不破坏兼容性的情况下改变,并且
  • 类型删除使得 toArray() 方法实现不可能知道列表的实际元素类型是什么,因此无论如何都无法正确处理。

关于java - 可以使 java.util.ArrayList<T>.toArray() 更友好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625877/

相关文章:

java - 为什么 NIO FileChannels 从 InputStream/OutputStream 创建

java - Adobe CQ5 请求参数绑定(bind)

java - 将 HttpServletRequest 类注入(inject) Service 类的风险

java - Android:多列 ArrayList 到 Listview

ruby-on-rails-3 - Rails 3 嵌套部分、集合、局部(Rails 教程第二版 : Chapter 10, 练习 5)

c# - 如何检查字符串数组是否包含特定字符串?

java - 数据库打不开(通过 DIIOP 的 Java 程序)

java - 2 ArrayList中的常见对象

java - 从 ArrayList 检索数据时出现逻辑错误

jquery - 用 jQuery 收集表单中的所有项目