gpt4 book ai didi

java - 如何使用泛型: Class>传递参数

转载 作者:太空宇宙 更新时间:2023-11-04 14:44:10 25 4
gpt4 key购买 nike

我尝试使用 JAXB 将 XML(String) 解析为对象,但我找不到调用我创建的方法的方法,因为我不知道如何指定类 BasicRequest<G>SomeRequestG

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

这是我的类(class):

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 的类型参数信息类在运行时被删除(参见 Class object of generic class (java) ),因此任何 Class代表 BasicRequest 的对象将简单地反射(reflect)原始类型。 (相应地,Unmarshaller 将无法知道该参数的用途。)

您可以尝试以下解决方案之一:

  1. 如果您确定 Unmarshaller 返回的内容符合 BasicRequest,那么您可以将结果转换为 JAXBElement<BasicRequest<G>> 。强制转换将产生未经检查的强制转换警告(同样,由于类型删除),可以使用 @SuppressWarnings("unchecked") 来抑制该警告。如果您愿意,可以在封闭方法上添加注释。
  2. 对于每个可以代替 G 的类,您可以创建一个子类,该子类扩展使用该类参数化的 BasicRequest,即:

    public class SomeBasicRequest extends BasicRequest<SomeRequest> {
    ...
    }

    SomeBasicRequest不能从 Class<BasicRequest<G>> 分配不过,因此您必须按如下方式更改方法 header :

    public <G extends BaseRequest> BasicRequest<G> xmlToRequest(String xml, Class<? extends BasicRequest<G>> t) {
    ...
    }

关于java - 如何使用泛型: Class<Clazz<G>>传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24640761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com