| /* |
| * @test /nodynamiccopyright/ |
| * @bug 8008813 |
| * @summary Structural most specific fails when method reference is passed to overloaded method |
| * @compile/fail/ref=MostSpecific08.out -XDrawDiagnostics MostSpecific08.java |
| */ |
| class MostSpecific08 { |
| |
| static class C { |
| int getInt() { return -1; } |
| Integer getInteger() { return -1; } |
| } |
| |
| interface IntResult { } |
| interface ReferenceResult<X> { } |
| |
| interface PrimitiveFunction { |
| int f(C c); |
| } |
| |
| interface ReferenceFunction<X> { |
| X f(C c); |
| } |
| |
| interface Tester { |
| IntResult apply(PrimitiveFunction p); |
| <Z> ReferenceResult<Z> apply(ReferenceFunction<Z> p); |
| } |
| |
| void testMref(Tester t) { |
| IntResult pr = t.apply(C::getInt); //ok - unoverloaded mref |
| ReferenceResult<Integer> rr = t.apply(C::getInteger); //ok - unoverloaded mref |
| } |
| |
| void testLambda(Tester t) { |
| IntResult pr1 = t.apply(c->c.getInt()); //ambiguous - implicit |
| IntResult pr2 = t.apply((C c)->c.getInt()); //ok |
| ReferenceResult<Integer> rr1 = t.apply(c->c.getInteger()); //ambiguous - implicit |
| ReferenceResult<Integer> rr2 = t.apply((C c)->c.getInteger()); //ok |
| } |
| } |