array java java-8 method-reference

java - La referencia de método a array clone() causa NoClassDefFoundError: Array



copy array javascript (1)

Este es el error JDK-8056051 . Está listado como arreglado en 8u40.

En función de los comentarios de los errores, javac usa una clase Dummy Array en algún momento durante la compilación y olvida volver a escribirla en la clase de matriz real, lo que causa este error.

Cuando ejecuto este código

List<int[]> list = Arrays.asList(new int[]{1, 2, 3}, new int[]{4, 5}); int[][] arr = list.stream().map(j -> j.clone()).toArray(int[][]::new); System.out.println(Arrays.deepToString(arr));

funciona como se esperaba y obtengo la salida

[[1, 2, 3], [4, 5]]

Sin embargo, si reemplazo el lambda por un método de referencia para el clone()

int[][] arr = list.stream().map(int[]::clone).toArray(int[][]::new);

Obtengo una excepción de tiempo de ejecución:

Exception in thread "main" java.lang.NoClassDefFoundError: Array at Main.lambda$MR$main$clone$8ed4b78b$1(Main.java:14) at Main$$Lambda$1/1160460865.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:576) at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:255) at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438) at Main.main(Main.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) Caused by: java.lang.ClassNotFoundException: Array at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

No entiendo esto en absoluto. Pensé que el método de referencia y el lambda eran equivalentes. También parece una excepción realmente extraña de obtener. ¿Alguien puede explicar?

Estoy usando JDK 1.8.0_25.