Per la classe innestata statica, è possibile fare riferimento ad esso utilizzando classe esterna - 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);
}
}
}
Per classe interna (classe non statica nidificato), si può fare 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);
}
}
}
Il mio IDE mi suggerisce di convertire x -> a.new B(x)
in A.B::new
, ma questo non viene compilato, perché B non è statico - non appartiene alla classe A
ma all'istanza della classe A
. Quindi, rispondendo alla tua domanda, penso che non sia possibile e dovrai usare outerInstanceName.new InnerClass(...)
.
fonte
2015-03-11 09:35:57
Potresti aggiungere del codice, ad esempio dove esattamente la classe è definita e dove vuoi usarla? –
È interessante notare che nella sezione di esempio del [JLS sui riferimenti al metodo] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13), esiste un esempio: 'Outer.Inner :: new' ma che non compila ... Forse intendevano' Outer.StaticNested :: new' ... – assylias
Non un riferimento al metodo, ma potresti usare un lambda come '() -> outer.new Interno() ' –