JAXB使用扩展对象工厂扩展生成的代码 - 显式转换是否良好?

时间:2012-03-12 09:02:15

标签: java types interface casting jaxb

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

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

  • ChildParent是JAXB生成的bean
  • ChildExParentEx是我自己的bean,用于将JAXB bean映射到给定的接口。两个bean都覆盖ObjectFactory
  • IChildIParent是其他一些库所需的接口

编辑: Eclipse甚至不让我的演员从List<Child>转到List<ChildEx>所以我必须添加一些丑陋的中间通配符强制转换(List<ChildEx>)(List<?>)super.getChild() < / p>

2 个答案:

答案 0 :(得分:3)

这应该有效:

return new ArrayList<IChild>( childExList );

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

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

答案 1 :(得分:1)

在Java中,将Generic<Type>投射到Generic<SuperType>是不安全的,这是您尝试通过将List<Child>投射到Collection<IChild>来实现的。想象一下List<Integer>被投射到List<Object>,这样您就可以将任何内容放入列表中,而不仅仅是Integer或子类型。

Generic<Type>转换为GenericSuperType<Type>是安全的,因为用户268396在评论中指出。

您需要将List<Child>复制到一些新的收藏中,例如

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

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