在Java 8中理解Stream.generate静态方法签名的问题

时间:2017-08-19 15:31:44

标签: java generics lambda java-8 java-stream

为什么java没有选择此签名<T> Stream <T> Stream.generate (Supplier <? extends T> supplier)而不是<T> Stream <T> Stream.generate (Supplier <T> supplier)

我的意思是下面的例子(不编译)是正确的,因为字符串的供应商在一个密码序列流中也是有效的吗?

Supplier <String> constantHello = () -> "Hello";

long count = Stream.<CharSequence>generate(constantHello).count();

2 个答案:

答案 0 :(得分:9)

这是一个错误。见https://bugs.openjdk.java.net/browse/JDK-8132097

在Java 9中已经更正了。正如您所见here,方法声明现在是

static <T> Stream<T> generate​(Supplier<? extends T> s)

答案 1 :(得分:0)

最好也许用不同的例子来证明。

给出一个Supplier,比如说,是一个双倍的:

Supplier<Double> generator = Math::random;

我们当然可以创建一个Stream双打:

Stream<Double> ds = Stream.generate(generator);

但是如果我想拥有Stream个数字怎么办?毕竟,假设double是一个数字,那么只允许这样的东西才有意义:

Stream<Number> ns = Stream.generate(generator);

由于generator不是Supplier<Number>,因此两个签名中的后一个不允许编译上述语句。但是,它是Supplier<Double>,因此是Supplier<? extends Number>