2014-09-15 12 views
6

Ho definito un metodo statico assertThat per estendere AssertJ. Questo metodo accetta un'espressione lambda del tipo:Chiamata di metodo ambigua con Lambda in Java

@FunctionalInterface 
public interface Action { 
    void execute() throws Exception; 
} 

La firma è simile al seguente:

public static ExceptionAssert assertThat(Action action) 

voglio usare questo metodo con un import statici. Ma è ambiguo. Il compilatore non sa se utilizzare il metodo assertThat(Iterable) o il mio metodo. Non capisco come un metodo void possa entrare in conflitto con un metodo che restituisce un Iterator<T>.

Qualche idea su come risolvere questo conflitto (senza scrivere il nome della classe davanti a assertThat)?

risposta

11

È necessario specificare il tipo di lambda in modo esplicito:

assertThat((Action)() -> { 
    ... 
}); 

L'altra opzione è semplicemente utilizzando l'altro nome, ad esempio, assertNoException

1

non capisco come un metodo void può conflitto con un metodo che restituisce un Iterator<T>.

L'unico modo in cui è possibile avere un tale conflitto è quando l'espressione lambda non viene mai completata normalmente, ad es. ()->{ throw new RuntimeException(); } o ()->{ for(;;); }.

(o se la vostra espressione lambda sono costituiti da un unico metodo invocazione che restituisce effettivamente un Iterable)

Per tutti gli altri casi hai ragione, non dovrebbe esistere un tale conflitto e, in effetti ho potuto compilare il codice equivalente senza problemi con jdk1.8.0_20 per espressioni lambda ordinarie (non hai incluso il codice che fa scattare l'errore nella tua domanda).

Se si è verificato il problema con un'espressione lambda che può essere completata normalmente e aver utilizzato un jdk precedente, è stato eseguito il bug discusso here. This answer fa riferimento alla parte specifica della lingua che specifica la differenza tra void - espressioni lambda compatibili e compatibili con il valore.

Se si utilizza un compilatore o IDE diverso, ad es. Eclipse, assicurati di utilizzare la versione più recente e di presentare una segnalazione di errore, se si verifica ancora questo errore.

+0

In realtà è il problema che il codice genera un'eccezione. – deamon

0

Ho avuto lo stesso problema con la versione di eclipse 4.4.1
Aggiornamento a 4.4.2 risolto.

0

Ho appena incontrato lo stesso problema e come brafdlog ha suggerito l'aggiornamento a una versione più recente di Eclipse risolto. Tranne che nel mio caso ero già in 4.4.2 (Spring Tool Suite 3.6.4) e aggiornato all'ultima Eclipse Neon 4.6.1 risolto.

Problemi correlati