Как работают ссылки на конструктор массива 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.)