【发布时间】:2016-06-04 02:55:16
【问题描述】:
我对使用 java.util.ArrayList
假设我将数组列表声明为:
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);
我希望多余的最终参数不存在,但即便如此, 我认为这是迄今为止我见过的将数组列表转换为数组的最不可怕的方法。
还有比这更好的吗?
【问题讨论】:
-
根本问题是由于擦除,在运行时类型 T 是未知的,因此如果没有一些帮助,您无法创建 T[]。
-
有什么理由绝对需要像
List<double[]>这样的类型吗?泛型和数组不能混用。 -
@dimo414 我到底想要的是一个double[][2];我正在使用 ArrayList 逐步构建它,因为我事先不知道最终的大小。 ArrayList 不适合做这个吗?
-
使用
List<List<Double>>。如果您必须,您可以将最终结果复制到数组中,但这很少需要。只需在整个应用程序中坚持使用集合类型,您就会更快乐。
标签: java arraylist collections