/*
 * @test /nodynamiccopyright/
 * @bug 8003280
 * @summary Add lambda tests
 *  Structural most specific doesn't handle cases with wildcards in functional interfaces
 * @compile/fail/ref=MostSpecific05.out -XDrawDiagnostics MostSpecific05.java
 */
public class MostSpecific05 {

    interface ObjectConverter<T extends Object> {
        T map(Object o);
    }

    interface NumberConverter<T extends Number> {
        T map(Object o);
    }

    static class MyMapper<A extends Object, B extends Number> {
        void map(ObjectConverter<? extends A> m) { }
        void map(NumberConverter<? extends B> m) { }
    }

    public static void meth() {
        MyMapper<Number, Double> mm = new MyMapper<Number, Double>();
        mm.map(e->1.0); //ambiguous - implicit
        mm.map((Object e)->1.0); //ok
    }
}
