Estaba revisando la documentación de Streams y observé que Stream es una interfaz escrita que extiende Base Stream con tipos como T y nuevamente Stream <T>
public interface Stream<T> extends BaseStream<T,Stream<T>> { } ¿Cómo puede una interfaz Stream extender la interfaz de flujo base que tiene límites de tipo al igual que la interfaz de flujo, es decir, Stream <T> ?
¿Por qué no podría?
Este es un truco que se usa en muchos lugares, por ejemplo, enumeraciones, que se definen como:
public abstract class Enum<E extends Enum<E>>La idea general es establecer un parámetro de tipo que represente su propio tipo .
Es por eso que la letra de ese parámetro es S. Eso significa "Self".
Por lo tanto, si observamos DoubleStream , se define como:
public interface DoubleStream extends BaseStream<Double, DoubleStream> {} El punto de hacer esto es para los métodos de 'retorno automático', o al menos, para los métodos que necesitan devolver el mismo tipo. Hay muchos de ellos en el concepto de flujo, como peek , limit o onClose .
Podría simplemente... no hacer eso, y definir las cosas de la siguiente manera:
public interface BaseStream<T> { BaseStream parallel(); } Pero el problema es que esto degrada los tipos. Si tengo un IntStream e invoco .parallel() en él, el compilador cree que el tipo es BaseStream . Por lo general, esto no es relevante (en el sentido de que IntStream puede ajustar el tipo de retorno, eso es válido según Java Lang Spec), pero a veces lo es.