[英]How to pass parameter with generic: Class<Clazz<G>>
我尝试使用JAXB将XML(String)解析为对象,但是我找不到调用已创建方法的方法,因为我不知道如何使用SomeRequest
作为G
指定类BasicRequest<G>
public class XMLParser {
public <G extends BaseRequest> BasicRequest<G> xmlToRequest(String xml,
Class<BasicRequest<G>> t) {
BasicRequest<G> request = null;
try {
JAXBContext context = JAXBContext.instance(t);
Unmarshaller m = context.createUnmarshaller();
StringReader reader = new StringReader(xml);
JAXBElement<BasicRequest<G>> unmarshal = m.unmarshal(new
StreamSource(reader), t);
request = unmarshal.getValue();
} catch (JAXBException ex) {
//write log
}
return request;
}
}
这是我的课程:
public abstract class BaseRequest {
protected String version;
//getter & setter
}
,
public class SomeRequest extends BaseRequest {
protected Integer id;
//getter & setter
}
和
public class BasicRequest<G extends BaseRequest> {
protected String user;
protected G data;
//getter & setter
}
实际上,所有类都正确地具有JAXB批注。
如果有人可以帮助我,该如何调用该方法或更好的定义方法,我将不胜感激。
也许某个精通JAXB的人有一个聪明的以JAXB为中心的解决方案,但是从泛型的角度来看,我认为没有一种方法可以做您想做的事情。 封闭的BasicRequest
类的类型参数信息在运行时会被擦除(请参见泛型类(java)的 Class
对象),因此任何表示BasicRequest
Class
对象BasicRequest
将简单地反映原始类型。 (相应地, Unmarshaller
将无法知道该参数的意图。)
您可以尝试以下解决方案之一:
JAXBElement<BasicRequest<G>>
。 强制转换将产生未经检查的强制转换警告(同样由于类型擦除),如果需要,可以使用封闭方法上的@SuppressWarnings("unchecked")
注释来@SuppressWarnings("unchecked")
。 对于可以代替G的每个类,您可以创建一个子类,该子类扩展使用该类参数化的BasicRequest,即:
public class SomeBasicRequest extends BasicRequest<SomeRequest> { ... }
SomeBasicRequest
,不能从Class<BasicRequest<G>>
分配Class<BasicRequest<G>>
,因此您必须按以下方式更改方法标头:
public <G extends BaseRequest> BasicRequest<G> xmlToRequest(String xml, Class<? extends BasicRequest<G>> t) { ... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.