enum StreamShape { REFERENCE, INT_VALUE, LONG_VALUE, DOUBLE_VALUE; } interface TerminalSink extends Sink { R getAndClearState(); } interface IntConsumer { public void accept(int value); } interface Consumer { public void accept(T t); } class ForEachOp { protected ForEachOp(TerminalSink sink, StreamShape shape) {} protected interface VoidTerminalSink extends TerminalSink { default public Void getAndClearState() { return null; } public interface OfInt extends VoidTerminalSink, Sink.OfInt{} } class Foo implements VoidTerminalSink.OfInt {} public static ForEachOp make(final Consumer consumer) { return new ForEachOp<>((VoidTerminalSink) consumer::accept, StreamShape.REFERENCE); } public static void make(final IntConsumer consumer) { VoidTerminalSink.OfInt accept = consumer::accept; } } interface Sink extends Consumer { default void accept(int value) {} interface OfInt extends Sink, IntConsumer { void accept(int value); default void accept(Integer i) {} } }