class Test { interface I1 { void m(String s); } interface I2 { void m(Integer s); } interface I3 { void m(Object o); } static class Foo { Foo(X x) { } } static void foo(X x) { } static void meth1(I1 s) { } static void meth2(I2 s) { } static void meth3(I3 s) { } static void meth4(I1 s) { } static void meth4(I2 s) { } static void meth4(I3 s) { } static { meth1(Foo::new); meth2(Foo::new); meth3(Foo::new); meth4(Foo::new); meth1(Test::foo); meth2(Test::foo); meth3(Test::foo); meth4(Test::foo); } void fooInstance(X x) { } interface II1 { void m(X x); } interface II2 { void m(X x); } interface II3 { void m(X x); } void test() { II1 i1 = this::fooInstance; II2 i2 = this::fooInstance; II3 i3 = this::fooInstance; } }