【问题标题】:JAXB extend generated code with extended object factory - explicit casts good?JAXB 使用扩展对象工厂扩展生成的代码 - 显式转换好吗?
【发布时间】:2012-03-12 09:02:14
【问题描述】:

我有一些 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> 所以我必须添加一些丑陋的中间通配符转换 (List<ChildEx>)(List<?>)super.getChild()

【问题讨论】:

  • 为什么需要这样做? List<Child>“是”Collection<Child> 在任何情况下。除非我错过了明显的,IParent 接口也完全满足任何IChild 实现吗?
  • 谢谢,但不,Parent 有方法List<Child> getChild()IParent 说它需要返回一个Collection<IChild>。因此,我将不得不在我的ParentEx 中进行显式转换。我不想修改自动生成的bean,因此为IParent 接口安装自动生成的bean 的唯一方法是编写自己的ParentEx implements IParent
  • 新 ArrayList 的解决方案是否适合您?

标签: java types interface casting jaxb


【解决方案1】:

这应该可行:

return new ArrayList<IChild>( childExList );

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

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

【讨论】:

    【解决方案2】:

    在 Java 中,将 Generic&lt;Type&gt; 转换为 Generic&lt;SuperType&gt; 不是类型安全的,而您正在尝试将 List&lt;Child&gt; 转换为 Collection&lt;IChild&gt;。想象一下 List&lt;Integer&gt; 被强制转换为 List&lt;Object&gt;,这将允许您将任何内容放入列表中,而不仅仅是 Integer 或子类型。

    正如 user268396 在评论中指出的那样,将 Generic&lt;Type&gt; 转换为 GenericSuperType&lt;Type&gt; 是安全的。

    您需要将List&lt;Child&gt; 复制到一些新集合中,例如

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

    然后您可以返回targetList,它可以隐式转换为Collection&lt;IChild&gt;

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2022-11-10
      相关资源
      最近更新 更多