为什么Java没有选择这个签名
<T> Stream<T> Stream.generate(Supplier<? extends T> supplier)
而是选择了这个 <T> Stream<T> Stream.generate(Supplier<T> supplier)
? 我的意思是下面的例子(不能编译)是正确的,因为提供String
也适用于CharSequence
流,不是吗?Supplier<String> constantHello = () -> "Hello";
long count = Stream.<CharSequence>generate(constantHello).count();
Supplier <String>
生成的字符串对象在Stream <CharSequence>
的上下文中是有效的,因为我们可以通过CharSequence
变量引用一个String
。 - marsoufSupplier<? extends T>
是有用的动机,假设我有一个Supplier<PrivateFooImpl>
并且想要从我的 API 返回一个Stream<Foo>
。我怀疑除非像 @StuartMarks 这样的人能够解释,否则我们很难回答为什么方法被声明成这样。还要注意,你可以通过说generate(constantHello::get)
或.map(s -> (CharSequence) s)
来绕过这个问题。 - Radiodef? extends T
,所以对于这个问题我点赞(+1)。 @marsouf :使用::get
技巧,你基本上创建了一个新的供应商,其类型在那里是必需的。(一个非常简化的解释 - 那里有一些相当强大的类型推断正在进行之中……) - Marco13? extends T
,那么它可能是一个(真正的)Stream<CharSequence>
。泛型不变的主要目的是保持类型安全。但由于流是“只读”的,因此这里不适用。 - Marco13