2016-05-31 173 views
3

我有一些包使用POJO进行卸载。我想制作一个通用的方法,你可以通过什么样的课程,你会把它放到什么地方。使用Java中的泛型解组XML使用泛型

例如:

pubic class Test<E> 
{ 
    E obj; 

    // Get all the tags/values from the XML 
    public void unmarshalXML(String xmlString) { 
     //SomeClass someClass; 
     JAXBContext jaxbContext; 
     Unmarshaller unmarshaller; 
     StringReader reader; 

     try { 
      jaxbContext = JAXBContext.newInstance(E.class); // This line doesn't work 
      unmarshaller = jaxbContext.createUnmarshaller(); 

      reader = new StringReader(xmlString); 
      obj = (E) unmarshaller.unmarshal(reader); 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我上线的错误在上述代码中指出:Illegal class literal for the type parameter E。当然,E将来自实际存在的POJO列表。

我该如何做到这一点?

回答

5

你不能做E.class,因为编译时会删除泛型(转换成Object类型,查看type erasure)。这是非法的,因为通用类型数据在运行时不可访问。

相反,你可以让开发者可以通过构造函数传递类文字,将其存储在外地,然后使用:

class Test<E> { 
    private Class<E> type; 

    public Test(Class<E> type) { 
     this.type = type; 
    } 

    public void unmarshall(String xmlString) { 
     //... 
     jaxbContext = JAXBContext.newInstance(type); 
    } 
} 

然后开发人员可以这样做:

new Test<SomeType>(SomeType.class); 
+0

我'假设'reader = ...'下面的行是'type =(Class )unmarshaller.unmarshal(reader);'? – syy

+1

@Flow Nope。你仍然会使用'obj =(E)unmarshaller.unmarshal(reader)'。你不应该删除'E obj'字段,因为这是存储解组数据的地方。这意味着你应该有2个字段:'type'和'obj'。 –

+0

哦,我明白了。非常感谢你的帮助! – syy