список Java объектов, что вся реализация интерфейс

Чем были самые большие проблемы, с которыми столкнулся сайт, и как они были решены? Слишком легко попытаться зафиксировать что-то, что не имеет смысла вообще только обнаруживать, что то, что кажется бессмысленным, является на самом деле единственной фиксацией для некоторой тонкой, но противной ошибки.

Прохождение через кода и рассмотрение чего-нибудь, что смотрит на все трудно для понимания и просто выяснение, "что это делает, почему Вы добавляли его?"

Удостоверяются, что Вы записываете их ответы - возможно, даже комментируют их в коде, таким образом, они там, когда Вам нужны они. Нет ничего более раздражающего, чем то чувство, "Я знаю , мне сказали об этом..."

11
задан Gerard 23 September 2009 в 08:01
поделиться

5 ответов

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

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

, поскольку все как есть, по определению IA.

Между тем, есть нет подстановочного знака для . Есть , а C может быть интерфейсом или классом; однако это не обязательно для того, что вы пытаетесь сделать.

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

3
ответ дан 3 December 2019 в 02:20
поделиться

Используйте 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 , чтобы указать параметр, который является суперклассом или подклассом данного класса.

20
ответ дан 3 December 2019 в 02:20
поделиться

А как насчет:

List<? extends IA> list;
7
ответ дан 3 December 2019 в 02:20
поделиться

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

List<? extends IA> list
2
ответ дан 3 December 2019 в 02:20
поделиться

Ну, вы могли бы объявить его List .

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

Пример:

List<IA> list = new ArrayList<IA>();
// code to populate list here
for (IA item : list) {
    item.iaMethod();
}
1
ответ дан 3 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: