(非静态)内部 class 的构造方法参考?

Constructor method reference for (non-static) inner class?

在给定外部 class 实例的情况下,对于内部 class,StaticClass::new 是否有等效项?

编辑:

即如果我有

class Outer {
    class Inner {
    }
}

我可以在旧 Java 中做到 Outer o = new Outer(); Inner i = o.new Inner()。如何将 o.new Inner() 表示为函数引用。

对于static nested class,可以使用outer class - OuterClass.NestedClass::new:

引用
public class Main {

    public static void main(String[] args) {
        int[] array = {1, 2, 3};

        Arrays.stream(array).forEach(A.B::new);
    }

}

class A {

    public A(int x) {
        System.out.println("A created, x = " + x);
    }

    public static class B {

        public B(int x) {
            System.out.println("B created, x = " + x);
        }

    }

}

对于内部class(嵌套非静态class),你可以做outerInstanceName.new InnerClass(...):

public class Main {

    public static void main(String[] args) {
        int[] array = {1, 2, 3};

        A a = new A(500);

        Arrays.stream(array).forEach(x -> a.new B(x));
    }

}

public class A {

    public A(int x) {
        System.out.println("A created, x = " + x);
    }

    public class B {

        public B(int x) {
            System.out.println("B created, x = " + x);
        }

    }

}

我的 IDE 建议我将 x -> a.new B(x) 转换为 A.B::new,但这无法编译,因为 B 不是静态的 - 它不属于 class A 但对于 class A 的实例。所以回答你的问题 - 我认为这是不可能的,你将不得不使用 outerInstanceName.new InnerClass(...).

根据Oracle tutorials,有四种方法引用:

  • 引用静态方法
    • ContainingClass::staticMethodName
  • 引用特定对象的实例方法
    • containingObject::instanceMethodName
  • 引用特定类型的任意对象的实例方法
    • ContainingType::methodName
  • 对构造函数的引用
    • ClassName::new

未列出对 local/nested class 的引用,因此我认为它不受支持。

您可以使用 java.util.function.Supplier 触发 lambda 的使用,以获得嵌套 class:

的实例
Outer outer = new Outer();
Supplier<Outer.Inner> supplier = () -> outer.new Inner();

JLS 中的 Chapter 15.13. Method Reference Expressions 对此有一些隐晦的陈述:

The immediately enclosing instance of a new inner class instance (§15.9.2) is provided by a lexically enclosing instance of this (§8.1.3).

这基本上意味着对内部 class 的构造函数的方法引用是可能的 外部 class 的方法中,就像在这个例子

import java.util.function.Supplier;
class Outer
{
    public class Inner
    {
    }
    void example()
    {
        Supplier<Inner> s = Inner::new;
    }
}

但是 JLS 没有提到任何替代方案,因此我们不得不假设除了 this 之外,不可能以任何其他形式提供封闭实例。