Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何遍历不同对象的列表?_Java_Xml_Jaxb_Abstract Class - Fatal编程技术网

Java 如何遍历不同对象的列表?

Java 如何遍历不同对象的列表?,java,xml,jaxb,abstract-class,Java,Xml,Jaxb,Abstract Class,注意:我在保密协议下,所以我必须使用没有意义的变量名。对不起 你好!! 我有一个抽象类: public abstract class A { public abstract List<String> someMethod(); } @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @XmlRootElement(name = "BField") @XmlAccessorType(

注意:我在保密协议下,所以我必须使用没有意义的变量名。对不起

你好!! 我有一个抽象类:

public abstract class A {

    public abstract List<String> someMethod();

}
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@XmlRootElement(name = "BField")
@XmlAccessorType(XmlAccessType.FIELD)
public class B extends A {
...
}

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@XmlRootElement(name = "CField")
@XmlAccessorType(XmlAccessType.FIELD)
public class C extends A {
...
}
然后在代码的某个地方有一个类,它列出了这两个类。大致如下:

@XmlElementWrapper(name = "MyStuffData")
    @XmlAnyElement(lax = true)
    @XmlElementRefs({
            @XmlElementRef(name = "B", type = B.class),
            @XmlElementRef(name = "C", type = C.class),
    })
    private List<A> myStuff;
然而,我得到了这个例外:

Caused by: java.lang.ClassCastException: org.apache.xerces.dom.ElementNSImpl cannot be cast to some.package.here.A

我听说lax=true可以解决这个问题,但我仍然得到相同的错误。令人费解的是,我可以得到列表的大小,这是相当准确的,但我不能迭代通过它。任何帮助都将不胜感激。很抱歉,我不太擅长解释,所以在google上找到这种东西有点痛苦。

看起来myStuff实际上不是List或List,而是List,其中org.apache.xerces.dom.ElementNSImpl实例似乎是实际B或C实例的某种包装器


您可以调试该列表,并尝试查看是否可以从org.apache.xerces.dom.ElementNSImpl获得B/C。对于此用例,您不应该使用@xmlanyementlax=true

用例1-@xmlementref

使用@XmlElementRef时,需要确保@XmlElementRef注释上的元素名称与@XmlRootElement或@XmlElementDecl注释完全匹配

input.xml

B

C

演示

输出


令人费解的是,我可以得到列表的大小,这是相当准确的,但我不能迭代通过它。这意味着列表的形式为list。。ಠ_ಠ 或者这就是包装器的工作原理,我之前没有jaxb的经验,由于时区差异,我无法联系设置这个的人。我打赌他睡着了。无论如何,谢谢。“一定会尝试的。”joannaSmith12我知道,现场离岸团队:
Caused by: java.lang.ClassCastException: org.apache.xerces.dom.ElementNSImpl cannot be cast to some.package.here.A
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <MyStuffData>
        <BField/>
        <CField/>
        <BField/>
    </MyStuffData>
</root>
import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementWrapper(name = "MyStuffData")
    @XmlElementRefs({
            @XmlElementRef(name = "BField", type = B.class),
            @XmlElementRef(name = "CField", type = C.class),
    })
    private List<A> myStuff;

    public List<A> getMyStuff() {
        return myStuff;
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <MyStuffData>
        <B/>
        <C/>
        <B/>
    </MyStuffData>
</root>
import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementWrapper(name = "MyStuffData")
    @XmlElements({
            @XmlElement(name = "B", type = B.class),
            @XmlElement(name = "C", type = C.class),
    })
    private List<A> myStuff;

    public List<A> getMyStuff() {
        return myStuff;
    }

}
public abstract class A {
}
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "BField")
public class B extends A {
}
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "CField")
public class C extends A {
}
import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17061559/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        for(A a : root.getMyStuff()) {
            System.out.println(a);
        }
    }

}
forum17061559.B@6998e5d9
forum17061559.C@351a3fb8
forum17061559.B@4e4d6