我有多个根元素,因此我需要编写
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了解不多,在阅读了一段时间后,我仍然感到困惑。有人可以帮我一点点。
答案 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);
}