enum StreamShape { REFERENCE, INT_VALUE, LONG_VALUE, DOUBLE_VALUE; } interface TerminalSink<T, R> extends Sink<T> { R getAndClearState(); } interface IntConsumer { public void accept(int value); } interface Consumer<T> { public void accept(T t); } class ForEachOp<T> { protected ForEachOp(TerminalSink<T, Void> sink, StreamShape shape) {} protected interface VoidTerminalSink<T> extends TerminalSink<T, Void> { default public Void getAndClearState() { return null; } public interface OfInt extends VoidTerminalSink<Integer>, Sink.OfInt{} } <error descr="Class 'Foo' must either be declared abstract or implement abstract method 'accept(int)' in 'OfInt'">class Foo implements VoidTerminalSink.OfInt</error> {} public static <T> ForEachOp<T> make(final Consumer<? super T> consumer) { return new ForEachOp<>((VoidTerminalSink<T>) consumer::accept, StreamShape.REFERENCE); } public static void make(final IntConsumer consumer) { VoidTerminalSink.OfInt accept = consumer::accept; } } interface Sink<T> extends Consumer<T> { default void accept(int value) {} interface OfInt extends Sink<Integer>, IntConsumer { void accept(int value); default void accept(Integer i) {} } }