programas - ¿Cómo funcionan las referencias de constructor de matrices Java 8?
programas en java de matrices (1)
Digamos que tenemos una variable de tipo IntFunction
que devuelve una matriz de enteros:
IntFunction<int[]> i;
Con los genéricos de Java 8, es posible inicializar esta variable con una referencia de constructor como esta:
i = int[]::new
¿Cómo lo traduce el compilador de Java a bytecode?
Sé que para otros tipos, como String::new
, puede usar una instrucción invokedynamic
que apunte al constructor de cadenas java/lang/String.<init>(...)
, que es solo un método con un significado especial.
¿Cómo funciona esto con las matrices, viendo que hay instrucciones especiales para construir matrices?
Puedes descubrirlo descompilando el bytecode de java:
javap -c -v -p MyClass.class
El compilador desugars array constructor hace referencia a Foo[]::new
en un lambda ( i -> new Foo[i]
), y luego continúa como con cualquier otra lambda o referencia de método. Aquí está el bytecode desmontado de esta lambda sintética:
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
(Su tipo de devolución es Object porque el tipo de devolución borrado en IntFunction es Object).