我的代码:
public static <T> T[] getArray(List<T> list){
return (T[]) list.toArray();
}
当调用该方法时,会抛出异常:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Integer[] arr = getArray(list); //Возникает исключение ClassCastException
是否可以从 转换List<T>为T[]?
此处不可能创建循环,因为不可能创建泛型数组,例如:T[] array = new T[5]; 因为代码未编译。
问题中提出的方法实现使用始终返回对象数组的方法
getArray,因此为该数组转换类型是没有意义的,并且总是会抛出异常:List::toArrayObject[]因此,您需要使用一种返回正确类型数组的方法
List::toArray(T[] arr),您应该向其中传递一个已知类型的数组,并且建议该数组的大小为零(请参阅Alexey Shipilev (2016) 的帖子)。T然而,这提出了在泛型方法中创建所需类型的数组getArray以便将其传递给该方法的问题List::toArray(T[] arr)(请参阅泛型和数组(2013))。要创建数组,您应该使用 方法,该方法需要有关数组元素所属类的
java.lang.reflect.Array.newInstance(Class<?> componentType, int size)信息作为输入参数。最简单的方法是将类的信息作为参数传递给原始方法:
此实现允许您为数组元素设置所需的类,该类也可以是数组元素的父(祖先)类:
此方法也适用于空列表或当结果数组的类型是列表中元素的父类 (
List<Child>-> ) 时,因为通过附加参数显式Parent[]提供有关元素类型的信息更容易的方法。Class<T>getArray假设有一个层次结构:
那么包含不同元素的列表:
var foo = List.of(new Child(), new Grand(), new Parent());只能通过显式指定结果数组的类型来转换为“父母”数组:但是,如果输入列表非空且同构(至少包含一个同类非空元素),并且需要将其转换为同类元素数组,即
List<T>->T[],则从第一个匹配元素中提取类信息就足够了:当然,这种方法的结果可以分配给父类型的数组,因为数组是协变的,但是如果您尝试向该数组写入不正确的值,则会抛出异常
ArrayStoreException:如有必要,可以增强该方法
findItemClass以查找非空列表元素的最常见父类,如下所示:通过此实现,可以针对不同元素转换列表:
一个有效但丑陋的解决方案。
像这样使用:
另一种选择是切换到 Scala。