<? 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>>.