class DefaultConstructor { interface I1 { R invoke(); } interface I2 { R invoke(A a); } static class Outer { class Inner { } static void test1() { I2 i2 = Inner :: new; I2 i2str = Inner :: new; } void test2() { I1 i1 = Inner :: new; I1 i1Int = Inner :: new; I2 i2 = Inner :: new; } } static void test1() { I2 i2 = Outer.Inner::new; I2 i2str = Outer.Inner::new; } void test2() { I2 i2 = Outer.Inner::new; I2 i2str = Outer.Inner::new; } } class DefaultConstructor1 { public void bar() { } { Runnable b1 = DefaultConstructor1 :: new; } } class DefaultConstructor2 { interface I { void foo(DefaultConstructor2 e); } void f() { I i1 = DefaultConstructor2 :: new; I i2 = this::new; } }