class Test { static <U> Iterable<U> map(Mapper<? super String, ? extends U> mapper) { return null; } static void test() { Integer next = map(String::length).iterator().next(); Integer next1 = map(Test::length).iterator().next();//error with int!!! } public static <T> T length(T s) { return null; } public static <T> /*int*/Integer length(String s) { return 0; } } interface Mapper<T, U> { U map(T t); }