2012-11-07 5 views
6

Nel mio codice ho più istanze di List<Future<something>> e volevo avere un unico metodo che gestisca l'attesa per il completamento. Ma ricevo un'eccezione del compilatore che mi dice che actual argument List<Future<Boolean>> cannot be converted to List<Future<?>>.non è possibile utilizzare l'elenco <Future<?>> nel parametro metodo quando viene chiamato da posizioni diverse

Questo è il metodo di testa:

public void waitForIt(<List<Future<?>> params) 

e questo è come si chiama:

... 
List<Future<Boolean>> actions = new ArrayList<Future<Boolean>>(); 
waitForIt(actions); <-- compiler error here 
... 

ho bisogno di questo per funzionare per List<Future<Map<String, String>>> e molti altri pure.

+0

Elenco >? – nogard

+0

nogard: No. non funziona. –

risposta

2

Utilizzare questa:

public <T> void waitForIt(List<Future<T>> params) 

come Future<Boolean> non è l'estensione di Future<?>

http://ideone.com/tFECPN

+0

Mi piace questo meglio della mia risposta, ho cancellato quello originale. Grazie. –

+0

"come futuro non è un'estensione di Future " cosa significa? "Futuro " è un sottotipo di "Futuro " – newacct

+0

si riferiva ad un'altra risposta che è stata cancellata –

3

Utilizzare questa:

public void waitForIt(List<? extends Future<?>> params) 

Quando si dispone di List<A> e List<B>, A e B devono corrispondere a corrispondere esattamente a. Poiché Future<Boolean> non è esattamente lo stesso di Future<?>, non funziona.

Future<Boolean> è un sottotipo di Future<?>, ma non è sufficiente. List<A> non è un sottotipo di List<B> anche se A è un sottotipo di B.

Abbiamo utilizzare un carattere jolly nel parametro tipo di List in modo che esso non deve corrispondere esattamente.

Problemi correlati