<? extends A> не принимает дочерние классы
Я работаю с Android Studio, и у меня проблема, я не знаю, как ее решить. Я не знаю, проблема с Android Studio, с Java или ошибкой make.
У меня есть класс, конструктор которого следующий:
public MakeQuery(Callable<ArrayList<? extends A>) {
...
}
Я пытаюсь создать объект этого класса со следующими строками:
Callable<ArrayList<B>> callable = new Callable<ArrayList<B>>() {...};
MakeQuery makeQuery = new MakeQuery(callable);
(Конечно, класс B
продолжается A
. Двойной флажок)
Но когда я вызываю конструктор, IDE сообщает мне, что он ожидает другого типа аргумента.
Какую ошибку я делаю? Спасибо за помощь!:)
Ответы
Ответ 1
Напишите Callable<? extends ArrayList<? extends A>>
.
Причины для этого сложны, но код, который вы написали, будет работать, только если вы пройдете точно Callable<ArrayList<? extends A>>
.
Правило состоит в том, что даже если B
продолжается A
, Foo<B>
не распространяется Foo<A>
. Однако он расширяет Foo<? extends A>
.
Итак, примените это правило дважды:
-
List<B>
не распространяется List<A>
, но он расширяет List<? extends A>
.
-
Callable<List<B>>
не расширяет Callable<List<? extends A>>
, но расширяет Callable<? extends List<? extends A>>
.