class Outer { class Inner { Inner(int a){} } } class Foo { void foo(Outer outer) { Inner inner = outer.new Inner(2); } } class Outer2<T> { class Inner2 { Inner2(T a){} } } class Foo2 { void foo(Outer2<String> outer) { Inner2 inner = outer.new Inner2(""); } } class Outer3 { class Inner3<T> { Inner3() {} T bar() { return null; } } } class Foo3 { void foo(Outer3 outer) { gul(outer.new Inner3<String>().bar()); } void gul(String s) {} void gul(Object o) {} }