Java 如何将任何对象的列表转换为具有相同类型的数组?

Java 如何将任何对象的列表转换为具有相同类型的数组?,java,generics,Java,Generics,鉴于我有一个如下所示的对象列表: import java.util.List; List<Protocol> protocolsTestData 但是,上面的代码只适用于类型协议,但我需要有一个通用函数,它可以将任何类型的列表转换为相同类型的数组 以下内容简洁且最佳 您不需要优化创建正确大小的数组,因为同时上面的JVM字节代码甚至比您的代码还要快。对于任何通用解决方案,仍然需要传递数组构造函数 流版本: Protocol[] protocolsTestDataArray =

鉴于我有一个如下所示的对象列表:

import java.util.List;    
List<Protocol> protocolsTestData

但是,上面的代码只适用于类型
协议
,但我需要有一个通用函数,它可以将任何类型的列表转换为相同类型的数组

以下内容简洁且最佳

您不需要优化创建正确大小的数组,因为同时上面的JVM字节代码甚至比您的代码还要快。对于任何通用解决方案,仍然需要传递数组构造函数

流版本:

Protocol[] protocolsTestDataArray = protocolsTestData.stream()
                                        .toArray(Protocol[]::new); 
一个(多余的)通用函数:

public static <A> A[] toArray​(List<A> list, IntFunction<A[]> generator) {
    return list.toArray(generator.apply(list.size()));
}

Protocol[] protocolsTestDataArray = toArray(protocolsTestData, Protocol[]::new); 
public static A[]toArray​(列表,IntFunction generator){
return list.toArray(generator.apply(list.size());
}
协议[]protocolsTestDataArray=toArray(protocolsTestData,协议[]:::新建);

函数需要知道实际的
A[]
构造函数,因为缺少关于A的信息(java的类型擦除)。

您是否要求提供一个数组实例,或者您将获得一个对象[]。您是否尝试过不带任何参数的List.toArray()?您可能受到java泛型的限制,或者,您需要扩展您的示例以显示更好的用例。若您只有一个列表,那个么您就不能得到一个只有T[]的对象[]。你可以看看我相信你能在这篇文章中得到你的答案:
列表。toArray
已经足够好了,它也是通用的。为什么需要另一个呢?您可能会补充说,不可能编写一个方法
publicstatica[]到阵列​(List List)
没有附加参数,因为在运行时,
List
没有关于其元素类型的任何信息
A
@RalfKleberhoff谢谢,这使它更清楚。斜体字“一个人仍然需要…”并解释。
Protocol[] protocolsTestDataArray = protocolsTestData.stream()
                                        .toArray(Protocol[]::new); 
public static <A> A[] toArray​(List<A> list, IntFunction<A[]> generator) {
    return list.toArray(generator.apply(list.size()));
}

Protocol[] protocolsTestDataArray = toArray(protocolsTestData, Protocol[]::new);