studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java java-8

java - para - manual de programacion android pdf



¿Por qué la siguiente conversión con referencia de método no produce un error de compilación? (2)

De la especificación :

Si el cuerpo de un lambda es una expresión de declaración (es decir, una expresión que se permitiría estar sola como una declaración), es compatible con un tipo de función que produce un vacío; Cualquier resultado es simplemente descartado.

Lo mismo es cierto para las referencias de métodos.

Es más flexible de esa manera. Supongamos que fue un error del compilador no usar un valor de retorno cuando se llama a un método normalmente, eso sería increíblemente molesto . Terminarías teniendo que usar variables falsas que no te importaban en algunos casos.

public class SomeClass { public static int someFunction(int a) { return a; } public static void main(String[] args) { someFunction(3); // "error" - ignoring return type int unused = someFunction(3); // "success" } }

Si desea una definición formal completa de lo que es aceptable, consulte 15.13.2. Tipo de referencia de un método .

public class SomeClass{ public static int someFunction(int a) { return a; } public static void main(String[] args) { Consumer<Integer> c = SomeClass::someFunction; } }

No entiendo por qué: Consumer<Integer> c = SomeClass::someFunction; no produce un error de compilación, ya que la función someFunction es un método con valor de retorno y Consumer representa los métodos sin valor de retorno


Esto se denomina void compatibility rule especial. Por ejemplo, ¿cuántas veces le ha importado realmente el tipo de retorno List#add ? Incluso si devuelve true/false .

Más o menos lo mismo aquí, puedes invocar un método, pero ignorar su resultado. Si reescribe a su consumidor como una expresión lambda, tiene más sentido:

Consumer<Integer> c = x -> { SomeClass.someFunction(x); return; }

Si recuerdo correctamente del JLS, solo hay algunos tipos permitidos para esto.

increment/decrement operations method invocation assignment instance creation