簡體   English   中英

如何將JAXB生成的集合中的All()項目添加到簡單的ArrayList中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM