JAXB extend generated code with extended object factory

I've got some JAXB generated beans which are in an hierarchical structure, eg one bean holds a list of other beans. Now I want to extend some child element and also the parent element holding the extended children.

My ParentEx implements some other interface IParent which is expected to return an Collection<IChild> . My ChildEx implements IChild . Can I return a (Collection<IChild>)super.getChild() when super.getChild() returns List<Child> ? Or is there a nicer way of doing this?

  • Child and Parent are JAXB generated beans
  • ChildEx and ParentEx are my own beans for mapping the JAXB beans to the given interfaces. Both beans override the ObjectFactory
  • IChild and IParent are the interfaces needed from some other library
  • Edit: Eclipse doesn't even let my cast from List<Child> to List<ChildEx> so I have to add some ugly intermediary wildcard cast (List<ChildEx>)(List<?>)super.getChild()


    This should work:

    return new ArrayList<IChild>( childExList );
    

    or (not pretty but avoids wildcard cast):

    return Arrays.asList( childExList.toArray(new IChild[]{}) );
    

    In Java it's not type safe to cast Generic<Type> to Generic<SuperType> which is what you are trying to do by casting List<Child> to Collection<IChild> . Imagine a List<Integer> being cast to List<Object> , that would allow you to put anything into the list, not just Integer or subtypes.

    It is safe to cast Generic<Type> to GenericSuperType<Type> as user268396 points out in the comment.

    You are going to need to copy the List<Child> into some new collection eg

    List<Child> sourceList = ...
    List<IChild> targetList = new ArrayList<IChild>();
    Collections.copy(targetList, sourceList); 
    

    You can then return targetList which can be implicitly cast to Collection<IChild>

    链接地址: http://www.djcxy.com/p/58220.html

    上一篇: Java中的XOR神经网络

    下一篇: JAXB使用扩展对象工厂扩展生成的代码