接口 Stream 如何扩展具有类型边界的基本流接口,就像流接口一样,即 Stream <T>?

How can a interface Stream extend Base stream interface having type bounds just as the stream interface i.e. Stream <T>?

我正在浏览 Streams 文档并观察到 ​​Stream 是一个类型化接口,它扩展了类型为 T 的 Base Stream 并且再次 Stream <T>

public interface Stream<T> extends BaseStream<T,Stream<T>> {
}

流接口如何扩展具有类型边界的基本流接口,就像流接口一样,即 Stream <T>

为什么不能呢?

这个技巧用在很多地方,比如枚举,定义为:

public abstract class Enum<E extends Enum<E>>

大意是建立一个代表你自己类型的类型参数

这就是为什么那个参数的字母是S。代表“Self”。

因此,如果我们查看 DoubleStream,它被定义为:

public interface DoubleStream extends BaseStream<Double, DoubleStream> {}

这样做的目的是针对 'self returning' 方法,或者至少是针对需要 return 相同类型的方法。流概念中有很多负载,例如 peek,或 limit,或 onClose

你可以……不那样做,定义如下:

public interface BaseStream<T> {
  BaseStream parallel();
}

但问题是,这种降级类型。如果我有一个 IntStream 并在其上调用 .parallel(),编译器认为它的类型是 BaseStream。这通常不相关(因为 IntStream 可以收紧 return 类型,根据 Java Lang Spec 是有效的),但有时它是。