JAXB使用扩展对象工厂扩展生成的代码

我有一些JAXB生成的bean,它们是分层结构的,例如一个bean拥有其他bean的列表。 现在我想扩展一些子元素,也是扩展子元素的父元素。

我的ParentEx实现了一些其他接口IParent ,预计它将返回一个Collection<IChild> 。 我的ChildEx实现IChild 。 当super.getChild()返回List<Child>时,我可以返回一个(Collection<IChild>)super.getChild()吗? 还是有更好的方法呢?

  • ChildParent是JAXB生成的bean
  • ChildExParentEx是我自己的bean,用于将JAXB bean映射到给定的接口。 这两个bean都覆盖ObjectFactory
  • IChildIParent是其他库所需的接口
  • 编辑: Eclipse甚至不让我从List<Child>List<ChildEx>所以我必须添加一些丑陋的中介通配符cast (List<ChildEx>)(List<?>)super.getChild()


    这应该工作:

    return new ArrayList<IChild>( childExList );
    

    或(不漂亮,但避免通配符):

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

    在Java中,将Generic<Type>强制转换为Generic<SuperType>不是类型安全的,这正是通过将List<Child>Collection<IChild> 。 想象一下List<Integer>被转换为List<Object> ,这将允许您将任何东西放入列表中,而不仅仅是Integer或子类型。

    当user268396在注释中指出时,将Generic<Type>强制转换为GenericSuperType<Type>是安全的。

    你将需要将List<Child>复制到一些新的集合中,例如

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

    然后您可以返回可以隐式转换为Collection<IChild> targetList

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

    上一篇: JAXB extend generated code with extended object factory

    下一篇: Preserving keyboard layout in swing app?