3789983e89
Reviewed-by: darcy, ihse
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
|
|
}
|
|
}
|