Stavo leggendo su Java 8 features e ho visto che hanno riferimenti al metodo, ma non ho visto come specificare quale metodo quando il metodo è sovraccarico. Qualcuno sa?Riferimenti al metodo per argomenti non vuoti?
risposta
Da this Lambda FAQ:
Dove può essere usato espressioni lambda?
metodo o il costruttore argomenti, per i quali il tipo di destinazione è il tipo di parametro appropriato . Se il metodo o il costruttore è sovraccarico, vengono utilizzati i soliti meccanismi di risoluzione del sovraccarico prima che l'espressione lambda corrisponda al tipo di destinazione. (Dopo la risoluzione di sovraccarico, , può essere ancora presente più di un metodo o costruttore firma che accetta diverse interfacce funzionali con identici descrittori funzionali . In questo caso, l'espressione lambda deve essere convertita nel tipo di una di queste interfacce funzionali) ;
Cast espressioni, che forniscono esplicitamente il tipo di destinazione. Per esempio:
Object o =() -> { System.out.println("hi"); }; // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable)() -> { System.out.println("hi"); }; // Legal because disambiguated
Quindi, avrete bisogno di lanciare, se ci sono le firme ambigui.
Il compilatore corrisponderà alla firma del metodo con l'interfaccia funzionale.
Integer foo(){...}
Integer foo(Number x){...}
Supplier<Number> f1 = this::foo; //()->Number, matching the 1st foo
Function<Integer, Number> f2 = this::foo; // Int->Number, matching the 2nd foo
In sostanza, f2
è qualcosa che può accettare un Integer
e restituire una Number
, il compilatore può scoprire che il 2 ° foo()
soddisfa il requisito.
Poiché le espressioni lambda sono una scorciatoia per interfacce funzionali, il tipo del metodo deve essere desumibile dal metodo nell'interfaccia. –
@ LeonardBrünings: questo non si riferisce alle espressioni lambda, ma ai riferimenti ai metodi, che sono diversi. Un'espressione lambda è un'implementazione di una funzione; un riferimento al metodo è un riferimento a un metodo preesistente da una classe preesistente. –
@LouisWasserman Secondo l'articolo a cui ho collegato, i riferimenti ai metodi verranno implementati come lambdas, quindi il mio tag. – ArtB