interface I<K, V> { public V put(K k, V v); } interface A<T>{} interface B<L> extends A<L>{} interface SameArgsI<T> { T same(T a, T b); } class InferenceFromArgs { private static <E> void bar(A<E> a, I<E, Integer> i) { } private static <E> void bazz(I<? super E, Integer> i) { } void foo(B<Integer> b) { bar(null, (k, v) -> v); bar(null, null); bar(b, (k, v) -> {return v;}); bar(b, (k, v) -> {<error descr="Incompatible types. Found: 'java.lang.Integer', required: 'java.lang.String'">String i = k;</error> return v;}); bar(b, (k, v) -> {Integer i = k; return v;}); bazz((k, v) -> v); bazz((k, v) -> {<error descr="Incompatible types. Found: 'java.lang.Object', required: 'int'">int i = k;</error> return v;}); } public static <T> SameArgsI<T> max() { return (a, b) -> b; } }