Tengo el siguiente código:
final var fieldValuesStream = items.stream() .map(person -> PersonFieldGetter.getFieldValueAsNumber(functionsParameters.getFieldName(), person)) // Number .mapToDouble(number -> number.doubleValue());IDEA resalta "número -> número.doubleValue()" con el mensaje:
Lambda se puede reemplazar con la referencia del método
Reemplace Lamda con la referencia del método
Pero cuando cambio el código a .mapToDouble(Number::doubleValue) ocurre un error de compilación:
QueryProcessor.java:31:34 java: tipos incompatibles: método de referencia de método no válido doubleValue en la clase java.lang.Number no se puede aplicar a los tipos dados requerido: no se encontraron argumentos: java.lang.Object razón: las listas de argumentos reales y formales difieren en largo
código fuente completo
¿Por qué está pasando esto?
Proyecto para reproducir el problema
EDITAR: Se agregó un enlace al proyecto de GitHub con un proyecto de ejemplo que no se puede compilar usando:
IntelliJ IDEA 2021.2.3 (última edición)
Compilación n.º IU-212.5457.46, compilada el 12 de octubre de 2021
Versión de tiempo de ejecución: 11.0.12+7-b1504.40 amd64
Máquina virtual: máquina virtual de servidor OpenJDK de 64 bits de JetBrains sro
SDK: Oracle OpenJDK 17.0.1
import java.util.List; public class Main { public static void main(String[] args) { List.of(0.1d).stream().map(aDouble -> { return List.of(1).stream().map(p -> aDouble).mapToDouble(Number::doubleValue); } ); } } Parece que el problema es que el compilador no puede reconocer el tipo de aDouble en el flujo anidado y causa un error extraño.
Stream.of(0.1d).map(aDouble -> List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue) );aDouble Stream.of(0.1d).map((Double aDouble) -> { return List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue); } ); Stream.of(0.1d).map(aDouble -> { return List.of(1).stream().map(p -> aDouble).mapToDouble(d -> d.doubleValue()); } );