2014-05-23 17 views
7

Mentre l'inferenza di tipo di Java 8 sembra molto migliorata, ho riscontrato un limite possibile e non sono sicuro che ci sia qualche soluzione che mi manca. Lo scenario:Limitazioni dell'inferenza di tipo con espressioni lambda

class Foo<T> { 
    <U> void apply(Function<T, Consumer<U>> bar) {} 
} 

class Bar { 
    void setBar(String bar){} 
} 

Foo<Bar> foo = new Foo<>(); 

Questo funziona:

foo.<String>apply(bar -> bar::setBar); 

Questo non lo fa:

foo.apply(bar -> bar::setBar); 

C'è un modo per ottenere l'inferenza di tipo a lavorare in questo tipo di situazione?

+0

E 'certamente un bug piuttosto che una limitazione, perché compilatore non sa tutto quello che serve in entrambi i casi. Ma data la cronologia di Java, suppongo che non rimarrà fissa fino a Java 9 (in 5-10 anni) –

+0

Non so se sia tecnicamente un bug - Ho avuto difficoltà a capire dal JLS se dovrebbe dedurre in questo caso o meno. Mi piacerebbe sapere se c'è qualcos'altro che posso fare per risolvere il problema però. –

+2

Stai usando un IDE? Perché non si compila in Eclipse ma fa con javac per me. –

risposta

6

Si tratta di un bug di eclisse. Entrambi compilano bene con Netbeans o javac.

Sembra che Eclipse ha quite pochi issues con Java 8 ...

+0

Lezione appresa - Se eclipse è strano, prova sempre con javac. –

+1

@JoshStone ... e viceversa. Ci sono casi in cui è solo il contrario ... – Marco13