(非静态)内部类的构造方法引用?

bil*_*.cn 9 java lambda java-8 java-stream

StaticClass::new给定外部类实例的内部类是否有相同的东西?

编辑:

即如果我有

class Outer {
    class Inner {
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以Outer o = new Outer(); Inner i = o.new Inner()用旧Java 做.如何表达o.new Inner()as函数引用.

Kon*_*kov 10

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

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

未列出对本地/嵌套类的引用,因此我认为它不受支持.

您可以使用它java.util.function.Supplier来触发lambdas的使用,以获取嵌套类的实例:

Outer outer = new Outer();
Supplier<Outer.Inner> supplier = () -> outer.new Inner();
Run Code Online (Sandbox Code Playgroud)


Mar*_*o13 6

章节15.13.方法参考 JLS中的表达式包含一个有点神秘的声明:

新内部类实例(第15.9.2节)的直接封闭实例由词汇封闭的this(§8.1.3)实例提供.

这基本上意味着,一个方法参照的内部类的构造是可能的外部类的方法,如在此实例中

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

但是JLS没有提到任何替代方案,因此必须假设根本不可能以任何其他形式提供封闭实例this.