public static <T> T fromXml(Class<T> clazz, String xml) {
Called as:
Thing thing = fromXml(Thing.class, xml);
or more explicitly:
Thing thing = MyClass.<Thing>fromXml(Thing.class, xml);
To be even more confusing you can have constructors that both construct a generic type and have a generic parameter themselves. Can’t remember the syntax and have never seen it used in anger (you are probably better off with a static creation method anyway).
The cast (T)
is unsafe, and you can’t write T.class. So include the T.class as an argument (as JAXBContext.newInstance
does) and throw a relevant exception if the type is wrong.
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
);
}
}
I believe the next version of JAXB (in 6u14?) has some convenience methods for this sort of thing in the JAXB
class.