2016-05-31 3 views
3

У меня есть пакеты с POJO для unmarhsalling. Я хочу создать общий метод, в котором вы можете пройти, какой класс вам не нравится.Unmarshal XML с использованием дженериков в Java

Например:

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

I Предполагая, что строка ниже 'reader = ...' будет 'type = (класс ) unmarshaller.unmarshal (reader);'? – syy

+1

@Flow Nope. Вы все равно будете использовать 'obj = (E) unmarshaller.unmarshal (reader)'. Вы не должны удалять поле 'E obj', так как там будут храниться данные без маршаллинга. Это означает, что у вас должно быть 2 поля: 'type' и' obj'. –

+0

О, я вижу. Огромное спасибо за помощь! – syy

Смежные вопросы