我想创建返回XML文档的Object表示的泛型函数(使用JAXB)。我需要将“class”对象传递给JAXBContext构造函数,但是如何从T中获取它?
public <T> readXmlToObject(String xmlFileName, T jaxbClass) {
JAXBContext context = JAXBContext.newInstance(T.class); // T.class - here error, how to get it?
.......
}
答案 0 :(得分:14)
改为传递类对象,这很容易。
public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
JAXBContext context = JAXBContext.newInstance( jaxbClass ); // T.class - here error, how to get it?
Object o = context.createUnmarshaller().unmarshal( new File( xmlFileName ) );
return jaxbClass.cast( o );
}
这里的想法是,由于你不能从对象中提取类型参数,你必须反过来做:从类开始,然后操纵对象以匹配类型参数。
答案 1 :(得分:7)
不要听别人的声音......你可以得到它。
只需将jaxbClass
参数的类型更改为Class<T>
:
public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
JAXBContext context = JAXBContext.newInstance(jaxbClass);
.......
}
答案 2 :(得分:3)
你无法在运行时获得课程。 Java使用Type Safe Erasure实现Generics,这意味着对Generic类型的理解仅适用于编译。如果要获取其类,则必须在运行时对实际对象进行interogate。
答案 3 :(得分:1)
基本上,类型T在运行时不可用 - Java泛型受erasure by the compiler的约束。
幸运的是,您已经有了一个类的实例,因此您可以从那里获取类型信息:
public <T> readXmlToObject(String xmlFileName, T jaxbClass) {
// if jaxbClass is an instance of the data object, you can do this:
JAXBContext context = JAXBContext.newInstance(jaxbClass.getClass());
// alternatively if jaxbClass is an instance of the Class object:
JAXBContext context = JAXBContext.newInstance(jaxbClass);
// ......
}
答案 4 :(得分:1)
尝试传递类本身,类似这样的
public <T> readXmlToObject(String xmlFileName, Class<T> class) {
答案 5 :(得分:0)
public class XYZ<T> {
...
private Class<T> tClass;
...
public <T> readXmlToObject(String xmlFileName) {
JAXBContext context = JAXBContext.newInstance(tClass);
...
}
...
}