我正在尝试使用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 )不适用于参数(ParameterRefEntryType)。”

我对Java通用Collection感到生疏,并且我不完全了解这里发生了什么。似乎我需要重新定义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

最佳答案

我不能给您关于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);

10-06 06:56