【发布时间】:2020-05-24 19:40:00
【问题描述】:
我想从动态数组的任何泛型类型的动态数组创建一个静态数组。我看到返回 Object[] 的 List#toArray() 并且它不使用泛型。将其强制转换为 T[] 是否安全,还是必须从使用它的类类型实例化整个数组?
我继续尝试创建自己的方法,以防 java 没有提供,但是我遇到了编译错误
public static <T> T[] toArray(List<T> list)
{
T[] li = (T[]) Array.newInstance(T.class, list.size());
int index = 0;
for(T obj : list)
{
li[index++] = obj;
}
return li;
}
【问题讨论】:
-
尽量避免混合使用数组和泛型。数组是协变的和保留的,而泛型是不变的和擦除的。这是麻烦的秘诀。 Even
ArrayListuses anObject[]as its backing structure 并且仅在返回元素时进行强制转换。 --- 由于泛型的擦除特性,它们的类型信息仅在编译时可用,这就是您无法在运行时访问T.class的原因。 -
还要注意,上面使用
newInstance()的代码并不比toArray()好——两者都需要转换 -
如果可以做到这一点,您不认为它会包含在集合 API 中吗?
标签: java arrays arraylist dynamic static