2015-04-04 6 views
31

że mamy zmienną typu IntFunction która zwraca tablicę liczb całkowitych:Jak działają odniesienia konstruktora tablic Java 8?

IntFunction<int[]> i; 

z Java 8 generycznych, możliwe jest, aby zainicjować tę zmienną z odniesieniem konstruktora, jak ta:

i = int[]::new 

Jak czy kompilator Java tłumaczy to na kod bajtowy?

Wiem, że dla innych typów, jak String::new, można użyć invokedynamic instrukcję wskazującą do konstruktora String java/lang/String.<init>(...), który jest po prostu metoda o specjalnym znaczeniu.

Jak to działa z tablicami, widząc, że istnieją specjalne instrukcje dotyczące tworzenia tablic?

+1

W Javie te nazywane są referencje, a nie wskaźniki. Ogólnie referencje zapewniają prawie wszystkie operacje wskaźnika, z tym że nie można dodać arbitralnego przesunięcia do odwołania lub wykonywać na nim innych operacji matematycznych. –

Odpowiedz

37

można dowiedzieć się o dekompilacji kodu binarnego JAVA:

javap -c -v -p MyClass.class 

Kompilator desugars odniesienia konstruktora Tablica Foo[]::new z lambda (i -> new Foo[i]), a następnie prowadzi się z każdym innym lambda i metodą referencyjną. Oto zdemontowany kod bajtowy tego syntetycznego lambda:

private static java.lang.Object lambda$MR$new$new$635084e0$1(int); 
descriptor: (I)Ljava/lang/Object; 
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC 
Code: 
    stack=1, locals=1, args_size=1 
    0: iload_0  
    1: anewarray  #6     // class java/lang/String 
    4: areturn  

(jest to typ zwracany jest obiekt, ponieważ usunięte typ zwracany jest w IntFunction Object).