我正在尝试使用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。
答案 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类型的元素)。