2015-06-29 22 views
10

Sto lavorando con Android Studio e continuo a riscontrare un problema che non so come risolvere. Non so se si tratta di un problema con Android Studio, con Java o un errore di una marca.<? extends A> non accetta le classi figlio di A

Ho una classe cui costruttore è il seguente:

public MakeQuery(Callable<ArrayList<? extends A>) { 
    ... 
} 

provo a creare un oggetto di quella classe con le seguenti righe:

Callable<ArrayList<B>> callable = new Callable<ArrayList<B>>() {...}; 
MakeQuery makeQuery = new MakeQuery(callable); 

(Naturalmente, classe B estende A Doppio controllo)

Ma quando chiamo il costruttore l'IDE mi dice che si aspetta un altro tipo di argomento.

Che errore sto facendo? Grazie per tutto l'aiuto! :)

+0

mostra tutto il codice della classe 'Callable' – Andrew

+1

L'IDE dice o il compilatore Java? – Oncaphillis

+0

L'IDE mi dice. Non riesco a compilare. E a proposito, Callable è un'interfaccia esistente sin da JDK v 1.5. Grazie dell'aiuto! –

risposta

11

Scrivi Callable<? extends ArrayList<? extends A>>.

Le ragioni sono complicate, ma il codice che hai scritto funzionerà solo se passi esattamenteCallable<ArrayList<? extends A>>.

La regola è che anche se B si estende A, Foo<B> non si estende Foo<A>. Tuttavia, estende lo Foo<? extends A>.

in modo da applicare la regola due volte:

  1. List<B> non si estende List<A>, ma si estende List<? extends A>.
  2. Callable<List<B>> non si estende Callable<List<? extends A>>, ma si estende Callable<? extends List<? extends A>>.
+0

Non capisco perché, ma sembra funzionare! –

+0

Questa risposta sarebbe meglio se spiegassi il motivo. Anche se è complicato, è meglio che "sembra funzionare". – Atreys

+0

Sono d'accordo. Mi piacerebbe sapere perché succede. –