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();
}