我首先要承认擦除可能会使这变得不可能。这是我正在尝试做的事情,但这不起作用:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Suppliers {
public static <CollectionType, T> CollectionType<T>
fill(CollectionType colltype, Supplier<T> gen, int n) {
return Stream.generate(gen)
.limit(n)
.collect(colltype::new, colltype::add, colltype::addAll);
}
}
目标是生成CollectionType
的实例,并使用n
将其填充gen
个项目。这种形式的collect()
会实例化一个新的集合,但我不清楚该类型是否可以通过fill()
的参数列表传递。 fill()
方法不必完全按照这种方式查看,只要它实例化一个新集合并填充它并返回结果。
答案 0 :(得分:5)
你有正确的想法,但你想要的是:
<T, C extends Collection<T>> C fill(Supplier<T> gen,
int n,
Supplier<C> factory) {
return Stream.generate(gen)
.limit(n)
.collect(factory, C::add, C::addAll);
}
然后你可以用:
来调用它HashSet<String> strings = fill(() -> "Foo", 10, HashSet::new);
此技术用于Collectors.toMap()
的4-arg版本等方法。