为什么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();
答案 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>
。