有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将JAXBG生成的集合中的all()项添加到简单的ArrayList?

我试图使用JAXB从一个大型XML文件中提取一些元素(从技术上讲,它是XTCE

JAXB为我生成了一组对象。要获得所需元素的子集,我需要调用:

List<SequenceEntryType> org.omg.space.xtce.EntryListType.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry();

我想加满一张支票

ArrayList<ParameterRefEntryType> integerParameters;

使用以下代码返回值:

integerParameters.addAll(...); // calling long JAXB-generated function above

参数refentrytype源于SequenceEntryType,所以只要我使用了合适的石膏,这应该是洁净的

然而,Eclipse报告:

“addAll方法(Collection<;?extensed ParameterRefEntryType>;)在类型中,ArrayList不适用于参数(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


共 (2) 个答案

  1. # 1 楼答案

    你的循环可以写得短一点:

    for(SequenceEntryType currEntry :
         entryList.getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry()) {
    
        if (currEntry instanceof ParameterRefEntryType) {
            _integers.add((ParameterRefEntryType)currEntry);
        }
    }
    

    当然,如果你的方法名不是那么长,看起来会更好

    smas已经说明了为什么它不能与addAll一起使用(原始列表可以包含非ParameterRefEntryType类型的元素)

  2. # 2 楼答案

    关于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

    所以积分参数。addAll()只能用于?扩展ParameterRefEntryType这意味着你只能在那里放置元素ParameterRefEntryType和childrens

    add()也有类似的要求,所以如果你想添加这个对象,你可以手动添加,但你必须强制转换你的currEntry:

    integerParameters.add((ParameterRefEntryType) currEntry);