/* * @test /nodynamiccopyright/ * @bug 8016081 8016178 * @summary structural most specific and stuckness * @compile/fail/ref=T8016177c.out -XDrawDiagnostics T8016177c.java */ class T8016177c { interface Function<X, Y> { Y m(X x); } interface ExtFunction<X, Y> extends Function<X, Y> { } <U, V> U m1(Function<U, V> f) { return null; } <U, V> U m1(ExtFunction<U, V> f) { return null; } void m2(Function<Integer, Integer> f) { } void m2(ExtFunction<Integer, Integer> f) { } void m3(Function<Integer, Integer> f) { } void m3(ExtFunction<Object, Integer> f) { } int g1(Object s) { return 1; } int g2(Number s) { return 1; } int g2(Object s) { return 1; } void test() { m1((Integer x)->x); //ok - explicit lambda - subtyping picks most specific m2((Integer x)->x); //ok - explicit lambda - subtyping picks most specific m3((Integer x)->x); //ok - explicit lambda (only one applicable) m1(x->1); //ok - stuck lambda but nominal most specific wins m2(x->1); //ok - stuck lambda but nominal most specific wins m3(x->1); //ambiguous - implicit lambda & different params m1(this::g1); //ok - unambiguous ref - subtyping picks most specific m2(this::g1); //ok - unambiguous ref - subtyping picks most specific m3(this::g1); //ambiguous - both applicable, neither most specific m1(this::g2); //ok - stuck mref but nominal most specific wins m2(this::g2); //ok - stuck mref but nominal most specific wins m3(this::g2); //ambiguous - different params } }