将Java集合类型参数类设置为数组
我想创建一个helper方法,它获取Collection
类型参数以返回一个列表。这就是我现在拥有的:
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
}
}
我的问题是:
- 是否可以完成
CollectionToArray(Collection<T>)
?- 如果是,怎么做李>
- 另外,是否可以首先将
List
和Set
作为参数传递李>
- 是否可以完成
ListToArray(List<T> list)
?- 如果是,怎么做李>
但这里有一些限制,因为我个人的口味
- 我不想使用
@SuppressWarnings
- 我真的想保留部分
.stream().toArray(Object[]::new)
(Java8部分!)李>
我有一种感觉,我需要通过使用类似:<T extends Object>
或<? extends T>
的东西来修复部分Object[]::new
,但我真的搞不清楚
请帮助我,并请提供一个解释,我经常被Generic
和?
弄糊涂
# 1 楼答案
不,你绝对不能这样做,如果有可能的话,库方法
Collection.toArray()
会给你与你的LHS相同的类型,但是当你想要与你的LHS完全相同的类型时,你必须使用Collection.toArray(T[])
(即使是ArrayStoreExceptions
附带的,也就是说,由程序员为数组提供正确的类型),原因是,在toArray()
中,您指定了Object[]
作为数组,以后不能将其强制转换为任何其他类型,否则将导致ClassCastException
之所以如此喧嚣,是因为泛型的工作方式,也就是说,它是编译时的事情,在运行时Java会将所有类型参数擦除为它们的上限类型,从而丢失创建数组所需的类型信息
一种安全的方法是向助手方法添加另一个参数,如下所示:
并将其用作
String[] arrayFromList = Helper.CollectionToArray(list, new String[0]);
不过大家最好还是使用
Collection#toArray(T[])