[英]How do I addAll() items from a JAXB-generated collection to a simple ArrayList?
我正在嘗試使用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>)不適用於參數(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);
您的循環可以寫得更短:
for(SequenceEntryType currEntry :
entryList.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry()) {
if (currEntry instanceof ParameterRefEntryType) {
_integers.add((ParameterRefEntryType)currEntry);
}
}
當然,如果您的方法名不是那么長,那么看起來會更好。
smas已經說過為什么不能與addAll
一起addAll
(原始列表可以包含非ParameterRefEntryType類型的元素)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.