如何将JAXB生成的集合中的所有()项添加到简单的ArrayList中?

时间:2011-03-30 18:19:22

标签: java jaxb

我正在尝试使用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报道:

“ArrayList类型中的方法addAll(Collection&lt;?extends ParameterRefEntryType&gt;)不适用于参数(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 个答案:

答案 0 :(得分:4)

我不能给你关于JAXB的提示,但这有点关于集合:

你有:

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

现在看看definiitions add和addAll:

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

在您的情况下,E是ParameterRefEntryType

所以integerParameters.addAll()只能用于?扩展ParameterRefEntryType它意味着你只能放置参数ParameterRefEntryType和childrenrens

add()有类似的要求,所以如果你想要添加这个对象你可以手动完成,但你必须强制转换你的currEntry:

integerParameters.add((ParameterRefEntryType) currEntry);

答案 1 :(得分:0)

您的循环可以写得更短:

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

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

当然,如果您的方法名称不是那么荒谬,那么看起来会更好。

smas已经说过为什么它不适用于addAll(原始列表可以包含不属于ParameterRefEntryType类型的元素)。