Как работают ссылки на конструктор массива Java 8?

Допустим у нас есть переменная типа IntFunction что возвращает целочисленный массив:

IntFunction<int[]> i;

С Java 8 generics можно инициализировать эту переменную с помощью ссылки конструктора, как это:

i = int[]::new

как компилятор Java переводит это в байт-код?

Я знаю, что для других типов, как String::new, он может использовать invokedynamic инструкция, указывающая на строковый конструктор java/lang/String.<init>(...), который является просто методом со специальным значение.

как это работает с массивами, видя, что есть специальные инструкции для построения массивов?

1 ответов


вы можете узнать сами, распаковав байт-код java:

javap -c -v -p MyClass.class

компилятор desugars конструктор массива ссылки Foo[]::new лямбда (i -> new Foo[i]), а затем продолжается как с любой другой ссылкой на лямбду или метод. Вот разобранный байт-код этой синтетической лямбды:

private static java.lang.Object lambda$MR$new$new5084e0(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       

(это возвращаемый тип Object, потому что стираемый возвращаемый тип в IntFunction-Object.)