简体   繁体   English

如何投放清单 <object> 列出 <MyType> 在java中?

[英]How to cast list<object> to list<MyType> in java?

PFB the code where i am trying to type cast list<object> to list<MyType> in java, PFB我试图在Java中将list<MyType> list<object>键入list<MyType>的代码,

List<CoOffer> couponOffList = (List<CoOffer>)cioffers.getContent();

This getContent() returns list<object> . getContent()返回list<object>

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "CiOffers")
public class CiOffers{

    @XmlElementRef(name = "CouponOffer", namespace = "http://www.ebi.com/webservices/", type = CouponOffer.class)
    @XmlMixed
    protected List<Object> content;

Now I have my java class CoOffer . 现在我有我的Java类CoOffer

import java.io.Serializable;

public class CoOffer implements Serializable{

    /**
     *
     */
    private static final long serialVersionUID = -3155316759617764263L;
    private String cooffName;

    public String getCooffName() {
        return cooffName;
    }
    public void setCooffName(String cooffName) {
        cooffName= cooffName;
    }


}

How to cast list to list in java? 如何在Java中将列表强制转换为列表?

该属性@XmlMixed注释,这意味着它表示混合的内容,因此,不能保证您要转换的类型是安全的-列表可能包含CouponOffer对象(表示元素)和java.lang.String对象的混合。 (表示元素之间的混合内容文本节点)。

You cannot cast it directly in a type-safe manner. 不能类型安全的方式直接强制转换。 Yes you can perform an unchecked cast, but that is not a good idea. 是的,您可以执行未经检查的强制转换,但这不是一个好主意。

Now a List<Object> can contain any type of object, and List<MyType> can only contain objects of type MyType . 现在,一个List<Object>可以包含任何类型的对象,和List<MyType>只能包含类型的对象MyType So its not possible . 因此不可能

Solution is to make JAXB generate List<MyType> than List<Object> 解决方案是使JAXB生成List<MyType>不是List<Object>

You can create a helper method to cast return a new list. 您可以创建一个辅助方法来强制返回新列表。

public <T> List<T> castTo(List<Object> ol, Class<T> t) {
    List<T> ret = new ArrayList<>();
    for (Object o : ol) {
        try {
            ret.add(t.cast(o));
        } catch (ClassCastException e) {
            System.err.println(e.getMessage()+" "+o);
        }
    }
    return ret;
}

And use it like that: 并像这样使用它:

@Test
public void testCastTo() {
    Class<MyType> t = MyType.class;
    List<Object> ol = new ArrayList<>();
    ol.add(new MyType(1));
    ol.add("12");
    ol.add(new MyType(123));
    List<MyType> l = c.castTo(ol, t);

    assertEquals(2,l.size());

}

If you are sure that returned object is List<CoOffer> you can cast it. 如果您确定返回的对象是List<CoOffer> ,则可以List<CoOffer>它。 As; 如;

(List<CoOffer>)(Object)cioffers.getContent();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM