sirve que para interfaz grafica getcontentpane ejemplo anotaciones java java-8 method-reference constructor-reference

que - ¿Puede Java 8 implementar la interfaz sobre la marcha como referencia de método?



jpanel (3)

Esta pregunta ya tiene una respuesta aquí:

Aprendo nuevas funcionalidades de Java 8.

Estoy jugando con diferentes ejemplos y he encontrado un comportamiento extraño:

public static void main(String[] args) { method(Test::new); } static class Test{ } private static void method(Supplier<Test> testSupplier){ Test test = testSupplier.get(); }

Este código se compila correctamente, pero no tengo idea de cómo funciona.

¿Por qué es Test::new aceptable como proveedor?

La interfaz del proveedor se ve muy simple:

@FunctionalInterface public interface Supplier<T> { T get(); }


La interfaz del Supplier tiene un método único (funcional) que:

  • No toma ningún parámetro;
  • devuelve un objeto.

Por lo tanto, cualquier método que cumpla con esos dos puntos, cumple con el contrato funcional del Supplier (porque los métodos tendrán la misma firma).

Aquí, el método en cuestión es una referencia de método. No toma parámetros y devuelve una nueva instancia de Test . Podrías reescribirlo a:

method(() -> new Test());

Test::new en azúcar sintáctica para esta expresión lambda.


Puede ser una Function , en lugar de un proveedor, si se requiere un argumento. Pero las referencias de métodos pueden referirse a constructores de la misma manera que se refieren a métodos; solo tienen un nombre divertido ( new ).

Desde el Tutorial de Java, hay cuatro tipos de referencias de métodos:

Kind Example ------------------------------- ------------------------------------ Reference to a static method ContainingClass::staticMethodName Reference to an instance method containingObject::instanceMethodName of a particular object Reference to an instance method ContainingType::methodName of an arbitrary object of a particular type Reference to a constructor ClassName::new


Test::new es una referencia del método. En lugar de agregar una nueva explicación, vale la pena echarle un vistazo al tutorial de referencias de métodos, ya que los explica bastante bien.

La respuesta directa a su pregunta es que el Supplier es una interfaz funcional, lo que significa que tiene un solo método no predeterminado. El constructor para la Test tiene exactamente la misma firma (sin argumentos, devuelve la Test ) y, por lo tanto, se puede hacer referencia directamente para crear un Supplier anónimo.

Hay cuatro tipos de referencias de métodos: consulte el tutorial para comprenderlos todos.