接口 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 是有效的),但有时它是。
我正在浏览 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 是有效的),但有时它是。