数组的Java集合类型参数
我想创建一个helper方法,它获取数组的Java集合类型参数,java,class,generics,java-8,abstract-class,Java,Class,Generics,Java 8,Abstract Class,我想创建一个helper方法,它获取Collectiontype参数以返回列表。这就是我现在拥有的: public class Helper { public static <T> T[] CollectionToArray(Collection<T> collection) { return collection.stream().toArray(Object[]::new); // Error } public static
Collection
type参数以返回列表。这就是我现在拥有的:
public class Helper {
public static <T> T[] CollectionToArray(Collection<T> collection) {
return collection.stream().toArray(Object[]::new); // Error
}
public static <T> T[] ListToArray(List<T> list) {
return list.stream().toArray(Object[]::new); // Error
}
}
public class IamSoNoob {
public void PleaseHelpMe() {
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
String[] arrayFromList = Helper.CollectionToArray(list); // Error
String[] arrayFromSet = Helper.CollectionToArray(set); // Error
String[] array = Helper.ListToArray(list); // Error
}
}
公共类助手{
公共静态T[]集合到阵列(集合){
返回collection.stream().toArray(对象[]::new);//错误
}
公共静态T[]ListToArray(列表){
return list.stream().toArray(Object[]::new);//错误
}
}
公共类IAMSONOB{
公共空间请帮助我(){
列表=新的ArrayList();
Set=newhashset();
字符串[]arrayFromList=Helper.CollectionToArray(list);//错误
字符串[]arrayFromSet=Helper.CollectionToArray(集合);//错误
字符串[]数组=Helper.ListToArray(list);//错误
}
}
我的问题是:
- 如果是,怎么做
- 另外,是否可以首先将
和列表
作为参数传递设置
列表阵列(列表列表)
?
- 如果是,怎么做
@SuppressWarnings
.stream().toArray(Object[]::new)
(Java8部分!)我有一种感觉,我需要修复部分
对象[]::new
通过使用类似的东西:
或不,如果可能的话,你绝对不能这么做库方法Collection.toArray()
将为您提供与LHS相同的类型,但当您需要与LHS完全相同的类型时,您必须使用Collection.toArray(T[])
(即使是ArrayStoreExceptions
也会附带ArrayStoreExceptions,即由程序员为数组提供正确的类型),原因在于toArray()
您已将对象[]
指定为数组,以后不能将其强制转换为任何其他类型,否则将导致ClassCastException
之所以如此喧嚣,是因为泛型的工作方式,也就是说,它是编译时的事情,在运行时Java会将所有类型参数擦除为它们的上限类型,从而丢失创建数组所需的类型信息
一种安全的方法是向助手方法添加另一个参数,如下所示
public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {
return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));
}
publicstatict[]CollectionToArray(集合集合,T[]arr){
返回collection.stream().toArray(value->Arrays.copyOf(arr,collection.size());
}
并将其用作
String[]arrayFromList=Helper.CollectionToArray(列表,新字符串[0])代码>
不过大家最好还是使用
Collection#toArray(T[])
如果可以仅从泛型类型构造数组,Stream.toArray()
不需要任何参数。您需要接受另一个参数。无论是T[]
还是IntFunction
@shmosel,未经检查的赋值(T[])集合.toArray()
?@nullpointer请求类CastException。仅仅使用集合.toArray(T[])
有什么坏处?为什么不直接执行String[]arrayFromList=list.toArray(新字符串[0])代码>?当标准库提供了经过测试、值得信赖且能做得很好的方法时,编写自己的方法背后的原因是什么?我删除了我的旧答案,因为它是错误的-谢谢你的答案:)