我正在尝试使用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);