Java список объектов, которые реализуют интерфейс

Предположим, что у меня есть класс, который реализует интерфейс:

public class A implements IB

и у меня есть List<A>, на который я хотел бы ссылаться: List<? implements IB> list. Чтобы я мог закодировать: for (IB item : list) и т.д.

Можно ли как-то сделать это на Java? Нет возможности <? implements ...>. Что мне не хватает?

Ответ 1

Если вы имели в виду, что класс A реализует IA, а не IB, тогда ваш код должен быть в порядке, говоря

for (A item : list) {
    // handle item as if it is an IA
}

так как все As являются, по определению IAs.

Между тем нет шаблона для <? implements C>. Существует <? extends C>, а C может быть интерфейсом или классом; однако это не обязательно для того, что вы пытаетесь сделать.

Если вы хотите прямо сказать for (IA item : list), потому что вы не гарантируете, что элементы в этом списке A s, но гарантируют, что они IA s, тогда я думаю, что у вас небольшая проблема (I не могу точно сказать, так как вы не сказали, где находится этот код обработки списка). A List<A> по определению не является List<IA>; если вы создаете List<A>, а затем передаете его методу, который ожидает List<IA>, вы получите ошибку времени компиляции. Однако вы можете создать List<IA> и заполнить его A s. Причина этого объясняется в учебнике Java по дженерикам.

Ответ 2

Используйте extends:

public void someMethod(List<? extends IB> list) {
  for (IB e : list) {
    // Perform some processing on each element.
  }
}

public void anotherMethod() {
  List<A> list = new ArrayList<A>();
  someMethod(list);
}

Дополнительную информацию можно найти на Учебники Java, в которой всеобъемлющий урока по дженерикам.

В частности, раздел на подстановочных знаках объясняет, как использовать ? с super и extends, чтобы указать параметр для который является суперклассом или подклассом данного класса.

Ответ 3

Как насчет:

List<? extends IA> list;

Ответ 4

Вы можете сделать это с помощью extends:

List<? extends IA> list

Ответ 5

Ну, вы можете объявить его List<IA>.

Для дальнейшего использования List может хранить любые объекты, которые реализуют IA в нем. Уловка заключается в том, что при извлечении их обратно вы не знаете оригинальный класс, не делая .getClass() на нем.

Пример:

List<IA> list = new ArrayList<IA>();
// code to populate list here
for (IA item : list) {
    item.iaMethod();
}