从泛型类型T获取“类”对象

时间:2012-05-29 13:46:56

标签: java generics

我想创建返回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?
   .......
}

6 个答案:

答案 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)

看看this SO answer

基本上,类型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);
       ...
    }
    ...
}