代码之家  ›  专栏  ›  技术社区  ›  Chris Knight

泛型可以避免我传回一个,呃,泛型“对象”吗?

  •  0
  • Chris Knight  · 技术社区  · 15 年前

    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

    2 回复  |  直到 15 年前
        1
  •  7
  •   skaffman    15 年前

    这根本不是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)连接起来的代码,这种情况并不少见。

    您可以通过以下方式调用:

    MyType x = getResponseObject(file, MyType.class, repo);
    
        2
  •  0
  •   james    15 年前

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

    不过,请注意,您可能应该处理JAXBElement。。。