JAXB расширяет сгенерированный код с помощью расширенной фабрики объектов. - PullRequest
7 голосов
/ 12 марта 2012

У меня есть несколько сгенерированных JAXB бинов, которые имеют иерархическую структуру, например один бин содержит список других бинов. Теперь я хочу расширить некоторый дочерний элемент, а также родительский элемент, содержащий расширенные дочерние элементы.

My ParentEx реализует некоторый другой интерфейс IParent, который, как ожидается, вернет Collection<IChild>. Мой ChildEx реализует IChild. Могу ли я вернуть (Collection<IChild>)super.getChild(), когда super.getChild() вернет List<Child>? Или есть более хороший способ сделать это?

  • Child и Parent являются сгенерированными JAXB бобами
  • ChildEx и ParentEx - мои собственные bean-компоненты для отображения bean-компонентов JAXB на заданные интерфейсы. Оба боба имеют приоритет над ObjectFactory
  • IChild и IParent - это интерфейсы, необходимые для некоторой другой библиотеки

Редактировать: Eclipse даже не позволяет моему касту от List<Child> до List<ChildEx>, поэтому мне нужно добавить некрасивое промежуточное использование групповых символов (List<ChildEx>)(List<?>)super.getChild()

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Это должно работать:

return new ArrayList<IChild>( childExList );

или (не красиво, но избегает подстановочных знаков):

return Arrays.asList( childExList.toArray(new IChild[]{}) );
1 голос
/ 12 марта 2012

В Java небезопасно приводить Generic<Type> к Generic<SuperType>, что вы пытаетесь сделать, приведя List<Child> к Collection<IChild>. Представьте, что List<Integer> приведен к List<Object>, который позволит вам поместить в список что угодно, не только Integer или подтипы.

Можно привести Generic<Type> к GenericSuperType<Type>, как указано в комментарии user268396.

Вам нужно будет скопировать List<Child> в новую коллекцию, например.

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

Затем вы можете вернуть targetList, который может быть неявно приведен к Collection<IChild>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...