针对内部类,是否有类似于StaticClass::new
的等效方法,可以使用外部类实例创建一个内部类对象?
编辑:
即,如果我有一个
class Outer {
class Inner {
}
}
我能在旧版Java中执行Outer o = new Outer(); Inner i = o.new Inner()
。那么如何将o.new Inner()
表示为函数引用呢?
针对内部类,是否有类似于StaticClass::new
的等效方法,可以使用外部类实例创建一个内部类对象?
编辑:
即,如果我有一个
class Outer {
class Inner {
}
}
我能在旧版Java中执行Outer o = new Outer(); Inner i = o.new Inner()
。那么如何将o.new Inner()
表示为函数引用呢?
ContainingClass::staticMethodName
containingObject::instanceMethodName
ContainingType::methodName
ClassName::new
java.util.function.Supplier
触发lambda的使用以获取嵌套类的实例:Outer outer = new Outer();
Supplier<Outer.Inner> supplier = () -> outer.new Inner();
JLS中的第15.13章方法引用表达式包含了一个比较晦涩的声明:
这基本上意味着在外部类的方法中可以使用对内部类构造函数的方法引用,就像这个例子中一样。
import java.util.function.Supplier;
class Outer
{
public class Inner
{
}
void example()
{
Supplier<Inner> s = Inner::new;
}
}
this
之外,无法以其他形式提供封闭实例。new Inner()
的原因。 :) - Konstantin Yovkov对于静态嵌套类,您可以使用外部类来引用它 - 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);
}
}
}
对于内部类(嵌套的非静态类),您可以使用 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不是静态的 - 它不属于类A
,而是属于类A
的实例。所以回答你的问题 - 我认为这是不可能的,你将不得不使用outerInstanceName.new InnerClass(...)
。
Outer.Inner::new
但那编译不过...也许他们的意思是Outer.StaticNested::new
... - assylias() -> outer.new Inner()
这样的 lambda。 - tobias_kOuter
内部,也就是如果一个Outer
的实例在作用域内,Outer.Inner::new
就会起作用。当然,你也可以直接写Inner::new
。 - Holger