1 /*
2  * @test /nodynamiccopyright/
3  * @bug 8034223
4  * @summary Most-specific testing for nested functional interface types
5  * @compile/fail/ref=MostSpecific14.out -XDrawDiagnostics MostSpecific14.java
6  */
7 class MostSpecific14 {
get()8     interface ToNumber { Number get(); }
get()9     interface ToToNumber { ToNumber get(); }
get()10     interface Factory<T> { T get(); }
11 
m1(Factory<Factory<Object>> f)12     void m1(Factory<Factory<Object>> f) {}
m1(ToToNumber f)13     void m1(ToToNumber f) {}
14 
m2(Factory<Factory<Number>> f)15     void m2(Factory<Factory<Number>> f) {}
m2(ToToNumber f)16     void m2(ToToNumber f) {}
17 
m3(Factory<Factory<Integer>> f)18     void m3(Factory<Factory<Integer>> f) {}
m3(ToToNumber f)19     void m3(ToToNumber f) {}
20 
21 
test()22     void test() {
23         m1(() -> () -> 23); // ok: choose ToToNumber
24         m2(() -> () -> 23); // error: ambiguous
25         m3(() -> () -> 23); // ok: choose Factory<Factory<Integer>>
26 
27         m1(() -> this::getInteger); // ok: choose ToToNumber
28         m2(() -> this::getInteger); // error: ambiguous
29         m3(() -> this::getInteger); // ok: choose Factory<Factory<Integer>>
30     }
31 
getInteger()32     Integer getInteger() { return 23; }
33 }