2015-04-04 34 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擦除的返回类型为对象。)