3

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

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);
    }
}

但很明显,我做错了。由于我对泛型了解不多,并且在阅读了一段时间后,我仍然感到困惑。有人可以在这里帮我一点忙。

4

4 回答 4

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;
}

如果你不能,作为方法名称,这里必须是动态的,一种可能性是使用反射(总是不可靠并且可能适得其反)。

请注意,您还必须传递ClassofT以便它在运行时可用(不可能这样做T.getName()):

public <T> JAXBElement<T> getJaxbElement (Object obj, Class<T> clazz){
    ObjectFactory objectFactory = getObjectFactory();
    String methodName = "create" +  clazz.getName();
    Method m = objectFactory.getClass().getDeclaredMethod(methodName, clazz);
    Object ret = m.invoke(objectFactory, obj);
    return (JAXBElement<T>) ret;
}
于 2012-09-27T16:39:31.350 回答
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);
    }
}
于 2012-09-27T17:39:39.327 回答
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;
    }        
}

问候!

于 2017-01-26T10:38:17.967 回答
0

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

public static <T> JAXBElement<T> createJaxbElement(T object, Class<T> clazz) {
    return new JAXBElement<>(new QName(clazz.getSimpleName()), clazz, object);
}
于 2019-03-21T03:17:24.217 回答