JAXB使用扩展对象工厂扩展生成的代码
我有一些JAXB生成的bean,它们是分层结构的,例如一个bean拥有其他bean的列表。 现在我想扩展一些子元素,也是扩展子元素的父元素。
我的ParentEx
实现了一些其他接口IParent
,预计它将返回一个Collection<IChild>
。 我的ChildEx
实现IChild
。 当super.getChild()
返回List<Child>
时,我可以返回一个(Collection<IChild>)super.getChild()
吗? 还是有更好的方法呢?
Child
和Parent
是JAXB生成的bean ChildEx
和ParentEx
是我自己的bean,用于将JAXB bean映射到给定的接口。 这两个bean都覆盖ObjectFactory
IChild
和IParent
是其他库所需的接口 编辑: 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
上一篇: JAXB extend generated code with extended object factory