2010-10-13 31 views
0

我有以下JAXB解组代码,我试图推广。这里是什么样子:泛型可以避免我传回一个通用的'Object'吗?

private Object getResponseObject(String stubbedXmlFile, 
     Class jaxbInterfaceClass, 
     AbstractRepository repository) { 
    Object responseObject = null; 
    try { 
     JAXBContext jc = JAXBContext.newInstance(jaxbInterfaceClass); 
     Unmarshaller u = jc.createUnmarshaller(); 
     InputStream resourceAsStream = TestProvidePensionValuationRepository.class.getClassLoader() 
       .getResourceAsStream(stubbedXmlFile); 
     BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream)); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 
     br.close(); 
     ByteArrayInputStream byteStream = 
       new ByteArrayInputStream(sb.toString().getBytes()); 
     responseObject = u.unmarshal(byteStream); 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return responseObject; 
} 

我的目标不是返回一个对象,但它传递作为参数相同的种类(例如在jaxbInterfaceClass)。我认为这可能是泛型的可能,但作为一个相对的新手对泛型我很难过。任何帮助感谢!

回答

7

这是不是一个真正的JAXB问题,只是一些仿制药的一些调整要求:

private <T> T getResponseObject(String stubbedXmlFile, 
           Class<T> jaxbInterfaceClass, 
           AbstractRepository repository) { 
    T responseObject = null; 
    // code as before 
    responseObject = (T) u.unmarshal(byteStream); 

    return responseObject; 
} 

这可能会提高一个编译器警告,但是这并不罕见与桥梁泛型代码与非代码像JAXB这样的通用代码。然而

responseObject = jaxbInterfaceClass.cast(u.unmarshal(byteStream)); 

注意到的是,你应该处理的JAXBElement ...:

可以再用称之为:

MyType x = getResponseObject(file, MyType.class, repo); 
+0

是的,我知道这不是一个JAXB问题。感谢您的回应,这只是我以前见过的那种代码,但不记得如何实现。助教。附: “T”字母可以是你喜欢的任何东西吗? – 2010-10-13 14:28:31

+1

@Chris:是的,'T'只是一个命名约定。不过,我建议坚持下去。 – skaffman 2010-10-13 14:30:01

+0

@Chris只是扩展了skaffman的评论:约定是使用单个字母,比如'T'来区分类名和变量的泛型类型参数。例如你可以称它为ClassToUnmarshal,但这会让人困惑。 – mikej 2010-10-13 14:37:59

0

您可以@ skaffman的代码类型安全与

相关问题