Java中没有泛型参数的泛型方法
在C#中,我实际上可以这样做:
//This is C#static T SomeMethod<T>() where T:new()
{
Console.WriteLine("Typeof T: "+typeof(T));
return new T();
}
//And call the method here
SomeMethod<SomeClassName>();
但是由于某种原因,我无法使其在Java中工作。
我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。
//This is Java, but doesn't workpublic static T fromXml<T>(String xml) {
try {
JAXBContext context = JAXBContext.newInstance(T.class);
Unmarshaller um = context.createUnmarshaller();
return (T)um.unmarshal(new StringReader(xml));
} catch (JAXBException je) {
throw new RuntimeException("Error interpreting XML response", je);
}
}
//Also the call doesn't work...
fromXml<SomeSubObject>("<xml/>");
回答:
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
类中为此类问题提供了一些便捷方法。
以上是 Java中没有泛型参数的泛型方法 的全部内容, 来源链接: utcz.com/qa/412607.html