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

Ind*_*eel 5 java generics type-bounds java-stream

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

public interface Stream<T> extends BaseStream<T,Stream<T>> {
}
Run Code Online (Sandbox Code Playgroud)

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

rzw*_*oot 7

为什么不能呢?

这是一个在很多地方使用的技巧,例如枚举,其定义为:

public abstract class Enum<E extends Enum<E>>
Run Code Online (Sandbox Code Playgroud)

总体思路是建立一个代表您自己的类型的类型参数

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

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

public interface DoubleStream extends BaseStream<Double, DoubleStream> {}
Run Code Online (Sandbox Code Playgroud)

这样做的目的是为了“自返回”方法,或者至少是为了需要返回相同类型的方法。流概念中有很多这样的概念,例如peek、 或limit、 或onClose

你可以只是......不这样做,并定义如下:

public interface BaseStream<T> {
  BaseStream parallel();
}
Run Code Online (Sandbox Code Playgroud)

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