Я пишу класс, который имеет два поля ArrayList
. Один для содержания пользовательских объектов. Другой предназначен для хранения пользовательских объектов коллекции (которые также могут иметь следующие поля):
private ArrayList<SomeClass> myObjList; // Just objects
private ArrayList<SomeCollectionClass> myCollectionList; // Collections of objects
Для реализации интерфейса Collection<E>
я написал метод iterator()
:
public Iterator<SomeClass> iterator() { ... }
Но для удобства я также начал писать deepIterator (), который возвращает Iterators
для каждой из коллекций в myCollectionList
- коллекции Iterators
- и все очень быстро запуталось:
public Iterator<SomeClass>[] deepIterator() {
int numIterators = this.myCollectionList.size();
Iterator<SomeClass>[] iters = (Iterator<SomeClass>[]) new Iterator<SomeClass>[numIterators]; // not allowed
for (int i = 0; i <= numIterators; i++) {
iters[i] = this.myCollectionList.get(i).iterator();
}
return iters;
}
и компилятор выдает ошибку "generic array creation"
. Я понимаю, почему это происходит, но я не понимаю, почему:
public Iterator<SomeClass>[] deepIterator() {
int numIterators = this.myCollectionList.size();
Iterator<SomeClass>[] iters = (Iterator<SomeClass>[])(Array.newInstance(Iterator.class, numIterators)); // allowed
for (int i = 0; i <= numIterators; i++) {
iters[i] = this.myCollectionList.get(i).iterator();
}
return iters;
}
компилируется просто отлично. Кто-нибудь может объяснить? Меня не особо интересуют преимущества array[]
по сравнению с некоторым Collection<E>
классом (ArrayList
или чем-то еще) в качестве возвращаемого типа, я просто озадачен этой строкой объявления / создания / инициализации. Заранее спасибо!