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()); } }