【发布时间】:2018-12-02 03:15:53
【问题描述】:
我想创建一个辅助方法,它获取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)的部分(Java 8 部分!)
我有一种感觉,我需要使用类似 <T extends Object> 或 <? extends T> 的方式来修复 Object[]::new 部分,但我真的不知道。
请帮帮我,也请提供一个解释,我经常被Generic和?弄糊涂。
【问题讨论】:
-
如果可以单独从泛型类型构造数组,
Stream.toArray()将不需要任何参数。 -
您需要接受另一个参数。
T[]或IntFunction<T>。 -
@shmosel 未检查的分配
(T[]) collection.toArray()怎么样? -
@nullpointer 那是在乞求 ClassCastException。
-
只使用
Collections.toArray(T[ ])有什么坏处?你为什么不直接做String[] arrayFromList =list.toArray(new String[0]);?当标准库提供经过测试的、可信赖的且完全符合您要求的方法时,编写您自己的方法的原因是什么?
标签: java class generics java-8 abstract-class