import java.util.function.*; class A { void f(T a, Consumer b) { } void g(Object o) { f((String) o, (t) -> t.charAt(0)); } } class Foo { class Base { public int sub; } class Sub1 extends Base { } class Sub2 extends Base { } public void doSomething(T thing, BiConsumer action) { action.accept("HELLO", thing); } private Sub1 s1; private Sub2 s2; public void foo(Base base) { if (base.sub == 1) doSomething((Sub1) base, (s, b) -> { System.out.println(s); this.s1 = b; }); if (base.sub == 2) doSomething((Sub2) base, (s, b) -> { System.out.println(s); this.s2 = b; }); } } class UnnecessaryCastError { public static void main(String args[]) { Env env = new Env<>(); map((String) env.getArgument("to"), x -> parse(x)); } public static U map(T t, Function mapper) { return null; } public static String parse(String text) { return null; } static class Env { T getArgument(String s) { return (T) null; } } }