Чем были самые большие проблемы, с которыми столкнулся сайт, и как они были решены? Слишком легко попытаться зафиксировать что-то, что не имеет смысла вообще только обнаруживать, что то, что кажется бессмысленным, является на самом деле единственной фиксацией для некоторой тонкой, но противной ошибки.
Прохождение через кода и рассмотрение чего-нибудь, что смотрит на все трудно для понимания и просто выяснение, "что это делает, почему Вы добавляли его?"
Удостоверяются, что Вы записываете их ответы - возможно, даже комментируют их в коде, таким образом, они там, когда Вам нужны они. Нет ничего более раздражающего, чем то чувство, "Я знаю , мне сказали об этом..."
Если вы имели в виду, что класс A реализует IA, а не IB, тогда ваш код должен быть в порядке, говоря
for (A item : list) {
// handle item as if it is an IA
}
, поскольку все как есть, по определению IA.
Между тем, есть нет подстановочного знака для реализует C>
. Есть расширяет C>
, а C
может быть интерфейсом или классом; однако это не обязательно для того, что вы пытаетесь сделать.
Если вы хотите прямо указать для (IA item: list)
, потому что вы не гарантируете, что элементы в этом списке равны A
, но гарантируют, что это IA
s, то я думаю, что у вас небольшая проблема (я не могу точно сказать, так как вы не сказали, где это код обработки списка находится). Список
- это , а не список < IA>
по определению; если вы создаете List
и затем передаете его методу, который ожидает List
, вы получите ошибку времени компиляции. Однако вы можете создать List
и заполнить его A
s. Причина этого объясняется в учебнике Java по дженерикам.
Используйте 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
, чтобы указать параметр, который является суперклассом или подклассом данного класса.
Вы можете сделать это с помощью extends
:
List<? extends IA> list
Ну, вы могли бы объявить его List
.
Для дальнейшего развития List может хранить в нем любые объекты, реализующие IA. Загвоздка в том, что при их извлечении вы не узнаете исходный класс, не выполнив для него .getClass ()
.
Пример:
List<IA> list = new ArrayList<IA>();
// code to populate list here
for (IA item : list) {
item.iaMethod();
}