interface I { public V put(K k, V v); } interface A{} interface B extends A{} interface SameArgsI { T same(T a, T b); } class InferenceFromArgs { private static void bar(A a, I i) { } private static void bazz(I i) { } void foo(B b) { bar(null, (k, v) -> v); bar(null, null); bar(b, (k, v) -> {return v;}); bar(b, (k, v) -> {String i = k; return v;}); bar(b, (k, v) -> {Integer i = k; return v;}); bazz((k, v) -> v); bazz((k, v) -> {int i = k; return v;}); } public static SameArgsI max() { return (a, b) -> b; } }