class WildcardBounds { interface I<T> { T foo(T a, T b); } void m1(I<? extends String> f1) {} void m2(I<? super String> f2) {} void m3(I<?> f3) {} I<? extends String> f1 = (a, b) -> a; I<? super String> f2 = (a, b) -> a; I<?> f3 = (a, b) -> a; { m1((a, b) -> a); m2((a, b) -> a); m3((a, b) -> a); } }