2013-03-27 2 views
13

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?

+0

Poiché le espressioni lambda sono una scorciatoia per interfacce funzionali, il tipo del metodo deve essere desumibile dal metodo nell'interfaccia. –

+0

@ 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. –

+0

@LouisWasserman Secondo l'articolo a cui ho collegato, i riferimenti ai metodi verranno implementati come lambdas, quindi il mio tag. – ArtB

risposta

5

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.

6

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.