我有一些JAXB生成的bean,它们是分层结构,例如一个bean拥有其他bean的列表。现在我想扩展一些子元素以及包含扩展子元素的父元素。
我的ParentEx
实现了一些其他接口IParent
,预计会返回Collection<IChild>
。我的ChildEx
实施IChild
。当(Collection<IChild>)super.getChild()
返回super.getChild()
时,我可以返回List<Child>
吗?或者有更好的方法吗?
Child
和Parent
是JAXB生成的bean ChildEx
和ParentEx
是我自己的bean,用于将JAXB bean映射到给定的接口。两个bean都覆盖ObjectFactory
IChild
和IParent
是其他一些库所需的接口 编辑: Eclipse甚至不让我的演员从List<Child>
转到List<ChildEx>
所以我必须添加一些丑陋的中间通配符强制转换(List<ChildEx>)(List<?>)super.getChild()
< / p>
答案 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>