class MyTest { MyTest() { } interface I { MyTest m(); } static void test(I s) { s.m(); } public static void main(String[] args) { I s = MyTest::new; s.m(); test(MyTest::new); } } class MyTest1 { MyTest1(Object o) { } MyTest1(Number n) { } interface I { MyTest1 m(Object o); } static void test(I s, Object arg) { s.m(arg); } public static void main(String[] args) { I s = MyTest1::new; s.m(""); test(MyTest1::new, ""); } } class MyTest2 { MyTest2(X x) { } interface I { MyTest2 m(Z z); } static void test(I s, Y arg) { s.m(arg); } public static void main(String[] args) { I s = MyTest2::new; s.m(""); test(MyTest2::new, ""); } } class MyTest3 { MyTest3(X x) { } interface I { MyTest3 m(Z z); } static void test(I s) { } public static void main(String[] args) { I s = MyTest3::new; test(MyTest3::new); } } class MyTestInvalidQ { class Super {} class ConstructorRefs extends Super { void test() { ConstructorRefs refs = new ConstructorRefs(); BlahBlah b0 = refs::new; BlahBlah blahBlah = this::new; BlahBlah1 blahBlah1 = super::new; } } interface BlahBlah { ConstructorRefs foo(); } interface BlahBlah1 { Super foo(); } abstract static class A { interface I { A foo(); } I i = A :: new; } }