48 lines
1.6 KiB
Java
48 lines
1.6 KiB
Java
|
/*
|
||
|
* @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
|
||
|
}
|
||
|
}
|