2012-03-12 7 views
7

Mam kilka fasoli generowanych przez JAXB, które są w strukturze hierarchicznej, np. jeden komponent bean zawiera listę innych komponentów bean. Teraz chcę rozszerzyć element potomny, a także element nadrzędny przytrzymujący rozszerzone elementy potomne.JAXB przedłuża wygenerowany kod z rozszerzoną fabryką obiektów - wyraźne rzutuje dobrze?

Mój ParentEx implementuje inny interfejs IParent, który powinien zwrócić wartość Collection<IChild>. Mój ChildEx implementuje IChild. Czy mogę zwrócić (Collection<IChild>)super.getChild(), gdy super.getChild() zwraca List<Child>? A może jest lepszy sposób na zrobienie tego?

  • Child i Parent są generowane JAXB fasoli
  • ChildEx i ParentEx są moje własne ziarna do mapowania fasolę JAXB do podanych interfejsach. Oba fasola przesłonić ObjectFactory
  • IChild i IParent interfejsy są potrzebne z innego biblioteki

Edit: Eclipse nawet nie pozwolić moją obsadę z List<Child> do List<ChildEx> więc muszę dodać trochę brzydki wieloznaczny pośrednika odlew (List<ChildEx>)(List<?>)super.getChild()

+1

Dlaczego miałbyś to robić? 'List ' 'jest" 'Collection ' w każdym przypadku. O ile nie brakuje mi oczywistego, interfejs 'IParent' jest w pełni zadowolony z każdej implementacji' IChild'? – user268396

+0

Dzięki, ale nie, "Parent" ma metodę "List getChild()", a "IParent" mówi, że musi zwrócić 'Collection '. Dlatego będę musiał wykonać ekslikt w moim 'ParentEx'. Nie chcę modyfikować automatycznie generowanych ziaren, dlatego jedynym sposobem na uzyskanie automatycznie generowanej fasoli dla interfejsu 'IParent' jest napisanie własnego' ParentEx implementuje IParent' –

+0

Czy rozwiązanie z nową ArrayList działa dla ciebie? – Andrejs

Odpowiedz

3

To powinno działać:

return new ArrayList<IChild>(childExList); 

lub (nie ładne, ale unika wieloznaczny cast):

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

W Javie nie typ bezpieczny rzucić Generic<Type> do Generic<SuperType> która jest, co staramy się robić oddając List<Child> do Collection<IChild>. Wyobraź sobie, że odlano List<Integer> do List<Object>, co pozwoliłoby ci umieścić coś na liście, a nie tylko Integer lub podtypy.

Bezpiecznie jest rzucić Generic<Type> na GenericSuperType<Type> jako użytkownik268396 wskazuje na komentarz.

Będziesz potrzebować skopiować List<Child> do jakiejś nowej kolekcji np.

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

Następnie można powrócić targetList które mogą być niejawnie rzutować na Collection<IChild>

Powiązane problemy