Как добавить элементыAll () из сгенерированной JAXB коллекции в простой ArrayList? - PullRequest
2 голосов
/ 30 марта 2011

Я пытаюсь использовать JAXB для извлечения некоторых элементов из большого XML-файла (технически это XTCE .)

JAXB создал коллекцию объектов для меня.Чтобы получить подмножество желаемых элементов, мне нужно позвонить:

List<SequenceEntryType> org.omg.space.xtce.EntryListType.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry();

Я хотел бы заполнить

ArrayList<ParameterRefEntryType> integerParameters;

возвращаемым значением, используя следующий код:

integerParameters.addAll(...); // calling long JAXB-generated function above

ParameterRefEntryType является производным от SequenceEntryType , так что это должно быть кошерным, пока я использовал соответствующее приведение.

Однако Eclipse сообщает:

"Метод addAll (Collection <? Extends ParameterRefEntryType>) в типе ArrayList не применим к аргументам (ParameterRefEntryType)."

Я ржавый в универсальных коллекциях Java, и яне до конца понимаю, что здесь происходит.Кажется, мне нужно переопределить свой ArrayList, чтобы принимать только элементы типа ParameterRefEntryType.Могу ли я использовать addAll (), как это, или мне нужно написать свой собственный цикл для добавления нужных элементов?

Альтернатива выглядит так:

List<SequenceEntryType> entries = 
    entryList.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry();
Iterator<SequenceEntryType> entryIterator = entries.iterator();
while (entryIterator.hasNext()) {
    SequenceEntryType currEntry = entryIterator.next();
    if (currEntry instanceof ParameterRefEntryType) {
        _integers.add(currEntry);
    }
}

Если этот метод необходимЯ определенно рассмотрю вопрос об использовании lambdaj .

Ответы [ 2 ]

4 голосов
/ 30 марта 2011

Я не могу дать вам подсказки о JAXB, но это немного о коллекциях:

У вас есть:

1. ParameterRefEntryType extends SequenceEntryType
2. ArrayList<ParameterRefEntryType> integerParameters;

, а теперь посмотрите на определения add и addAll:

public boolean addAll(Collection<? extends E> c)
public boolean add(E e)

В вашем случае E является ParameterRefEntryType

, так что integerParameters.addAll () может работать только с?расширяет ParameterRefEntryType, это означает, что вы можете поместить туда только элементы ParameterRefEntryType и childrens

add () имеет аналогичное требование, поэтому, если вы хотите добавить этот объект, вы можете сделать это вручную, но вы должны привести свое currEntry:

integerParameters.add((ParameterRefEntryType) currEntry);
0 голосов
/ 31 марта 2011

Ваш цикл может быть записан немного короче:

for(SequenceEntryType currEntry :
     entryList.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry()) {

    if (currEntry instanceof ParameterRefEntryType) {
        _integers.add((ParameterRefEntryType)currEntry);
    }
}

Конечно, выглядит лучше, если имена ваших методов не так длинны.

smas уже сказал, почему он не работает с addAll (исходный список может содержать элементы, не относящиеся к типу ParameterRefEntryType).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...