У меня была куча табличных представлений, в которых был дублирован код. Они использовали для прямого наследования класс AbstractView. Поэтому я заставил их наследовать AbstractListView (который в свою очередь наследовал бы от AbstractView), который был бы новым классом, содержащим все общие свойства для этих таблиц.Многоуровневое наследование и foreach Java loop
Поскольку я сделал, что изменение этого цикла ведет себя странно:
for (AbstractViewPanel view : registeredViews) {
view.modelPropertyChange(evt);
}
Вот ArrayList: registeredViews:
private ArrayList<AbstractViewPanel> registeredViews;
Я запускать отладчик и registeredViews ArrayList имеет все включая таблицы. По какой-то причине он кидается на последний непосредственно унаследованный вид в коллекции и полностью пропускает их.
Все мои взгляды, используемые непосредственно наследовать:
public class someView extends AbstractViewPanel
Теперь, так как мое изменение некоторых взглядов, как это:
public class someOtherView extends AbstractListView
Вот AbstractListView:
public abstract class AbstractListView extends AbstractViewPanel
Вот AbstractViewPanel
public abstract class AbstractViewPanel extends JPanel {
public abstract void modelPropertyChange(PropertyChangeEvent evt);
}
Петля просто не перебирает ничего, что наследует AbstractListView, но я бы предположил, что все виды в конце имеют тип AbstractView.
UPDATE мне удалось найти обходной путь он просто включает в себя изменение цикла:
for (int i = 0; i < registeredViews.size(); i++)
{
registeredViews.get(i).modelPropertyChange(evt);
}
Я хотел бы знать, хотя, почему цикл Еогеасп стиль дает мне головную боль.
Как определяется 'AbstractViewPanel'? – nhahtdh
Кто? ArrayList является регулярным с Java, я не реализовал какой-либо пользовательский шаблон итератора. Я подозреваю проблему с потоками, хотя прямо сейчас, цикл не заканчивается, он никогда не доходит до конца функции. –
Какой параметр типа указан в объявлении 'registerViews'. – trashgod