使用Generics返回Dynamic JAXBElement

时间:2012-09-27 16:07:28

标签: java generics jaxb

我有多个根元素,因此我需要编写

JAXBElement<BookType> jaxbBookType = objectFactory.createBookType (bookType);
JAXBElement<OrderType> jaxbOrderType = objectFactory.createOrderType (orderType);

等等。我不想一次又一次地编写这段代码。我正在尝试编写一个方法,它将根据其输入返回JAXBElement。

我想写的是

public <T> JAXBElement<T> getJaxbElement (Object obj){
    if (obj instanceof OrderType){
        return objectFactory.createOrderType((OrderType)obj);
    }
}

但显然,我做错了。由于我对Generics了解不多,在阅读了一段时间后,我仍然感到困惑。有人可以帮我一点点。

4 个答案:

答案 0 :(得分:3)

如果您可以假设instanceof运算符与参数一起使用,只需转换为JAXBElement<T>即可:

public <T> JAXBElement<T> getJaxbElement (Object obj){
    Object ret;
    if (obj instanceof OrderType){
        ret = objectFactory.createOrderType((OrderType)obj);
    }
    else if (obj instanceof BookType){
        ret = objectFactory.createBookType((BookType)obj);
    }
    return (JAXBElement<T>) ret;
}

如果你不能作为方法名称,那么这里必须是动态的,可能是使用反射(总是不可靠,可能适应各种问题) 。

请注意,您还必须传递Class T以便它在运行时可用(它不可能{{1} }}):

T.getName()

答案 1 :(得分:0)

public <T> JAXBElement<T> getJaxbElement (Object obj){
    if (obj instanceof OrderType){
        return (JAXBElement<T>)objectFactory.createOrderType((OrderType)obj);
    }
}

或可能使T obj的类型

public <T> JAXBElement<T> getJaxbElement (T obj){
    if (obj instanceof OrderType){
        return (JAXBElement<T>)objectFactory.createOrderType((OrderType)obj);
    }
}

答案 2 :(得分:0)

JAXBElement 通用

的另一种选择
public class Example<T> {

    public JAXBElement<T> toDo(final T genericType, Class<T> operationClass) {
        final JAXBElement<T> jaxbElement = 
            new JAXBElement<T>(new QName(operationClass.getClass().getSimpleName()), operationClass, genericType);

        return jaxbElement;
    }        
}

问候!

答案 3 :(得分:0)

简单的方法,我在下面做了:

public static <T> JAXBElement<T> createJaxbElement(T object, Class<T> clazz) {
    return new JAXBElement<>(new QName(clazz.getSimpleName()), clazz, object);
}