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>?
为什么不能呢?
这是一个在很多地方使用的技巧,例如枚举,其定义为:
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 规范这是有效的),但有时是相关的。
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |