14

我想制作返回 XML 文档的对象表示的通用函数(使用 JAXB)。我需要将“类”对象传递给 JAXBContext 构造函数,但是如何从 T 中获取它?

public <T> readXmlToObject(String xmlFileName, T  jaxbClass) {
   JAXBContext context = JAXBContext.newInstance(T.class); // T.class - here error, how to get it?
   .......
}
4

6 回答 6

17

而是传递类对象,这很容易。

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

这里的想法是,由于您无法从对象中提取类型参数,因此您必须反过来:从类开始,然后操作对象以匹配类型参数。

于 2012-05-29T13:52:18.283 回答
7

不要听别人的……你能明白的。

只需将jaxbClass参数的类型更改为Class<T>

public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
   JAXBContext context = JAXBContext.newInstance(jaxbClass);
   .......
}
于 2012-05-29T13:53:42.117 回答
3

您无法在运行时获得类。Java 使用类型安全擦除来实现泛型,这意味着对泛型类型的理解仅适用于编译。如果要获取其类,则必须在运行时询问实际对象。

于 2012-05-29T13:51:28.303 回答
1

看看这个 SO 答案

基本上,类型 T 在运行时不可用 - Java 泛型会被编译器擦除

幸运的是,您已经有了类的实例,因此您可以从那里获取类型信息:

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);
   // ......
}
于 2012-05-29T13:52:42.773 回答
1

尝试通过类本身,像这样

public <T> readXmlToObject(String xmlFileName, Class<T> class) {
于 2012-05-29T13:52:44.773 回答
0
public class XYZ<T> {
    ...
    private Class<T> tClass;    
    ...
    public <T> readXmlToObject(String xmlFileName) {
       JAXBContext context = JAXBContext.newInstance(tClass);
       ...
    }
    ...
} 
于 2014-07-25T17:03:04.140 回答