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 work

public 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

回到顶部