public static <T> T fromXml(Class<T> clazz, String xml) {
Вызывается как:
Thing thing = fromXml(Thing.class, xml);
или более явно:
Thing thing = MyClass.<Thing>fromXml(Thing.class, xml);
Чтобы быть еще более запутанным, у вас могут быть конструкторы, которые как создают универсальный тип, так и сами имеют универсальный параметр. Не могу вспомнить синтаксис и никогда не видел, чтобы он использовался в гневе (вам все равно лучше использовать статический метод создания).
Приведение (T)
небезопасно, и вы не можете написать T.class. Поэтому включите T.class в качестве аргумента (как это делает JAXBContext.newInstance
) и сгенерируйте соответствующее исключение, если тип неправильный.
public static <T> T fromXml(Class<T> clazz, String xml) {
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller um = context.createUnmarshaller();
Object obj = um.unmarshal(new StringReader(xml));
try {
return clazz.cast(obj);
} catch (ClassCastException exc) {
throw new RelevantException(
"Expected class "+clazz+
" but was "+obj.getClass()
);
}
} catch (JAXBException exc) {
throw new RelevantException(
"Error unmarshalling XML response",
exc
);
}
}
Я считаю, что в следующей версии JAXB (в 6u14?) Есть несколько удобных методов для такого рода вещей в классе JAXB
.