class TestData {} interface TerminalOp extends IntermediateOp {} interface IntermediateOp { boolean m(L1 l, M1 m);} class Test { protected U exerciseOps(TestData data, TerminalOp terminal, IntermediateOp... ops) { return exerciseOps(data, terminal, (u, v) -> u.equals(v)); } } class Test1 { protected U exerciseOps(TestData data, TerminalOp terminal, IntermediateOp... ops) { return exerciseOps(data, terminal, (u, v) -> u.equals(v)); } } class Test2 { protected U exerciseOps(TestData data, TerminalOp terminal, IntermediateOp... ops) { return exerciseOps(data, terminal, (u, v) -> u.equals(v)); } }