当前位置:  开发笔记 > 编程语言 > 正文

Java中没有泛型参数的通用方法

如何解决《Java中没有泛型参数的通用方法》经验,为你挑选了2个好方法。

在C#中我可以这样做:

//This is C#
static T SomeMethod() where T:new()
{
  Console.WriteLine("Typeof T: "+typeof(T));
  return new T();
}

//And call the method here
SomeMethod();

但由于某种原因,我不能让它在Java中工作.

我想要做的是,在超类上创建一个静态方法,这样子类就可以转换为XML.

//This is Java, but doesn't work
public static T fromXml(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("");

Tom Hawtin -.. 52

public static  T fromXml(Class clazz, String xml) {

被称为:

Thing thing = fromXml(Thing.class, xml);

或更明确地:

Thing thing = MyClass.fromXml(Thing.class, xml);

更令人困惑的是,您可以拥有构造函数,这些构造函数都构造泛型类型并且本身具有泛型参数.不记得语法,并且从未见过它在愤怒中使用过(无论如何,你最好使用静态创建方法).

演员表(T)是不安全的,你不能写T.class.因此,将T.class作为参数包含(同样JAXBContext.newInstance如此),如果类型错误则抛出相关的异常.

public static  T fromXml(Class 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这类事情有一些方便的方法.



1> Tom Hawtin -..:
public static  T fromXml(Class clazz, String xml) {

被称为:

Thing thing = fromXml(Thing.class, xml);

或更明确地:

Thing thing = MyClass.fromXml(Thing.class, xml);

更令人困惑的是,您可以拥有构造函数,这些构造函数都构造泛型类型并且本身具有泛型参数.不记得语法,并且从未见过它在愤怒中使用过(无论如何,你最好使用静态创建方法).

演员表(T)是不安全的,你不能写T.class.因此,将T.class作为参数包含(同样JAXBContext.newInstance如此),如果类型错误则抛出相关的异常.

public static  T fromXml(Class 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这类事情有一些方便的方法.


甚至不会编译...你不能写T.class
我并不是说在方法中写T.class.我说是一个argumnet.并且调用函数可能没有(或者可能将它作为argumnet传递).

2> Avi..:

在Java中,泛型是仅编译时的数据,在运行时会丢失.所以,如果你调用这样的方法,JVM就无法知道它是什么T.class.解决此问题的常用方法是将类实例对象作为参数传递给方法,如下所示:

public static  T fromXml(Class clazz, String xml) {
  try {
    JAXBContext context = JAXBContext.newInstance(clazz);
    Unmarshaller um = context.createUnmarshaller();
    return (T)um.unmarshal(new StringReader(xml));
  } catch (JAXBException je) {
    throw new RuntimeException("Error interpreting XML response", je);
  }
}

fromXml(SomeSubObject.class, "");

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有