import java.util.*; class TestData {} interface TerminalOp extends IntermediateOp {} interface IntermediateOp { boolean _(L1 l, M1 m);} class Test1 { protected U exerciseOps(TestData data, TerminalOp terminal, IntermediateOp... ops) { return exerciseOps(data, (u, v) -> u.equals(v), terminal); } } class Test2 { protected U exerciseOps(TestData data, TerminalOp terminal, IntermediateOp... ops) { return exerciseOps(data, (u, v) -> u.equals(v), terminal); } } class Test3 { interface I { void m(Y y); } static void bar(I i, List l){ bar(x -> {}, l); bar(x -> {}, null); bar((I)x -> {}, null); bar((T x) -> {}, null); bar(x -> {}, new ArrayList()); bar(x -> {}, new ArrayList()); } static { bar(x->{}, new ArrayList()); } } class Test4 { protected U exerciseOps(TestData data, TerminalOp1 terminal, IntermediateOp1... ops) { return exerciseOps(data, (u, v) -> u.equals(v), terminal, ops); } protected static U exerciseOps(TestData data, BiPredicate1 equalator, TerminalOp1 terminalOp, IntermediateOp1[] ops) { return null; } public interface IntermediateOp1 { } public interface BiPredicate1 extends IntermediateOp1{ boolean _(T t, U u); } public interface TerminalOp1 extends IntermediateOp1 {} } class Test5 { { Block empty = x -> {}; Block empty1 = x -> {}; System.out.println((Block) x -> {}); } interface Block { void apply(T t); } }