class ViableCallable { public void Run(C1 x1, C1 x2, T1 t1, T1[] t1s) { // Viable callables: C2.M(), C3.M(), C4.M(), C5.M(), C6.M(), C7.M(), C8.M(), C9.M() x1.M(t1, 8); // Viable callables: C4.M(), C6.M(), C7.M() x2.M(t1s, false); // Viable callables: C2.M(), C6.M(), C8.M() C1 x3 = Mock(); x3.M("abc", 42); // Viable callables: C2.M(), C3.M(), C6.M(), C8.M() C1 x4 = Mock(); x4.M("abc", 42l); // Viable callables: C4.M(), C6.M() C1 x5 = Mock(); x5.M(new Integer[]{ 42 }, (Object)null); // Viable callables: C2.M(), C5.M(), C6.M(), C8.M(), C9.M() C1 x6 = Mock(); x6.M("", (Object)null); // Viable callables: C6.M() C1 x7 = new C6(); x7.M(t1, ""); // Viable callables: C1.f() I1 i1 = Mock(); i1.f("", t1); // Viable callables: C1.f() I2 i2 = Mock(); i2.f("", 0l); } TMock Mock() { throw new Error(); } void CreateTypeInstance() { Run(new C2(), null, null, null); Run(new C2(), null, null, null); Run(new C2(), null, null, null); Run(new C4(), null, null, null); Run(null, new C4(), null, null); Run(new C6(), null, null, null); Run(new C6(), null, null, null); Run(new C6(), null, null, null); Run(new C6(), null, null, null); Run(null, new C6(), null, null); Run(new C7(), null, null, null); Run(new C8(), null, null, null); Run(new C9(), null, null, null); } } abstract class C1 { public abstract T2_C1 M(T1_C1 x, T3_C1 y); public void Run(T1_C1 x) { // Viable callables: C2.M(), C3.M(), C4.M(), C5.M(), C6.M(), C7.M(), C8.M(), C9.M() M(x, 8); } public void f(T1_C1 x, T2_C1 y) { throw new Error(); } } interface I1 { void f(String x, T_I1 y); } interface I2 { void f(String x, T_I2 y); default void g(T_I2 y) { // Viable callables: C1.f() f("", y); } } class C2 extends C1 implements I1 { @Override public T_C2 M(String x, T3_C2 y) { throw new Error(); } } class C3 extends C1 implements I2 { @Override public Long M(String x, T3_C3 y) { throw new Error(); } } class C4 extends C1 { @Override public Boolean M(T_C4[] x, T3_C4 y) { throw new Error(); } } class C5 extends C1 { @Override public Boolean M(String x, T3_C5 y) { throw new Error(); } } class C6 extends C1 { @Override public T2_C6 M(T1_C6 x, T3_C6 y) { throw new Error(); } public void Run(T1_C6 x) { // Viable callables: C6.M(), C7.M() M(x, 8); // Viable callables: C6.M(), C7.M() this.M(x, 8); } } class C7 extends C6 { @Override public Byte M(T1_C7 x, T3_C7 y) { throw new Error(); } public void Run(T1_C7 x) { // Viable callables: C7.M() M(x, 8); // Viable callables: C7.M() this.M(x, 8); // Viable callables: C6.M() super.M(x, 8); } } class C8 extends C1 { @Override public T2_C8 M(String x, T3_C8 y) { throw new Error(); } } class C9 extends C8 { @Override public Boolean M(String x, T3_C9 y) { throw new Error(); } }