2015-04-04 28 views
31

假設我們有一個返回一個整數陣列IntFunction類型的變量:Java 8數組構造函數的引用是如何工作的?

i = int[]::new 

如何:

IntFunction<int[]> i; 

在Java 8個泛型,有可能用一個構造參考這樣初始化此可變Java編譯器是否將其轉換爲字節碼?

我知道對於其他類型,如String::new,它可以使用invokedynamic指令指向字符串構造函數java/lang/String.<init>(...),這只是一個具有特殊含義的方法。

這是如何與數組工作,看到有特殊的指令來構造數組?

+1

在Java中,這些被稱爲引用,而不是指針。一般而言,引用幾乎可以提供指針的所有操作,但不能將任意偏移量添加到引用或對其執行其他類型的數學運算。 – 2015-04-04 15:15:10

回答

37

可以通過反編譯的Java字節碼找出自己:

javap -c -v -p MyClass.class 

編譯器desugars數組構造引用Foo[]::new到的λ(i -> new Foo[i]),然後進入與任何其他的λ或方法參考。下面是這個合成的λ的拆卸字節碼:

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  

(它的返回類型爲對象,因爲在IntFunction擦除的返回類型爲對象。)