import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; class OuterClass { private class InnerClass {} private static void someMethod(OuterClass.InnerClass inner) {} static void callSomeMethod(OuterClass.InnerClass inner) { someMethod(inner); } } class Outer { public static Outer loopback(Outer.Inner u){ return foo(u); } private static Outer foo(Outer.Inner u){ return null; } private class Inner{} } class Outer1 { public static void loopback(List.Inner> u){ Outer1.Inner a = foo(u); } private static Outer1.Inner foo(List.Inner> u){ return null; } private class Inner {} } class Outer2 { public static void loopback(List.Inner> u){ Outer2.Inner a = foo(u); } private static Outer2.Inner foo(List.Inner> u){ return null; } private class Inner {} } class Outer3 { { bar(Outer3.Inner::new, new ArrayList<>()); bar(Inner::new, new ArrayList<>()); } private void bar(final Supplier.Inner> s, List l) { } private class Inner {} }