(非静态)内部 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
之外,不可能以任何其他形式提供封闭实例。
在给定外部 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
之外,不可能以任何其他形式提供封闭实例。