java - <? extiende A> no aceptará clases de niños A
android arraylist (1)
Estoy trabajando con Android Studio y sigo teniendo un problema que no sé cómo resolver. No sé si es un problema con Android Studio, con Java o un error una marca.
Tengo una clase cuyo constructor es el siguiente:
public MakeQuery(Callable<ArrayList<? extends A>) {
...
}
Intento crear un objeto de esa clase con las siguientes líneas:
Callable<ArrayList<B>> callable = new Callable<ArrayList<B>>() {...};
MakeQuery makeQuery = new MakeQuery(callable);
(Por supuesto, la clase B
extiende A
Doble marcada)
Pero cuando llamo al constructor, el IDE me dice que espera otro tipo de argumento.
¿Qué error estoy cometiendo? ¡Gracias por toda la ayuda! :)
Escribir Callable<? extends ArrayList<? extends A>>
Callable<? extends ArrayList<? extends A>>
Callable<? extends ArrayList<? extends A>>
.
Las razones para esto son complicadas, pero el código que escribió solo funcionará si Callable<ArrayList<? extends A>>
exactamente Callable<ArrayList<? extends A>>
Callable<ArrayList<? extends A>>
.
La regla es que incluso si B
extiende A
, Foo<B>
no extiende Foo<A>
. Sin embargo, extiende Foo<? extends A>
Foo<? extends A>
.
Entonces aplica esa regla dos veces:
-
List<B>
no extiende laList<A>
, pero extiende laList<? extends A>
List<? extends A>
. -
Callable<List<B>>
Callable<List<? extends A>>
no se extiendeCallable<List<? extends A>>
Callable<List<? extends A>>
, pero se extiendeCallable<? extends List<? extends A>>
Callable<? extends List<? extends A>>
Callable<? extends List<? extends A>>
.