2012-03-12 14 views
7

Ho alcuni bean generati da JAXB che si trovano in una struttura gerarchica, ad es. un fagiolo contiene un elenco di altri fagioli. Ora voglio estendere alcuni elementi figlio e anche l'elemento genitore che tiene i bambini estesi.JAXB estende il codice generato con l'oggetto factory esteso - il cast esplicito è buono?

Il mio ParentEx implementa un'altra interfaccia IParent che dovrebbe restituire un Collection<IChild>. I miei strumenti ChildExIChild. Posso restituire un (Collection<IChild>)super.getChild() quando super.getChild() restituisce List<Child>? O c'è un modo migliore per farlo?

  • Child e Parent sono JAXB generato fagioli
  • ChildEx e ParentEx sono i miei fagioli per mappare i fagioli JAXB alle interfacce dati. Entrambi i fagioli sostituiscono il ObjectFactory
  • IChild e IParent sono le interfacce necessarie da qualche altra libreria

Edit: Eclipse non ha nemmeno lasciare che il mio cast List<Child>-List<ChildEx> quindi devo aggiungere un po 'brutto jolly intermediario getto (List<ChildEx>)(List<?>)super.getChild()

+1

Perché dovresti farlo? 'Lista ' "è una" Collezione "in ogni caso. A meno che non mi sfugga l'ovvio, l'interfaccia 'IParent' è pienamente soddisfatta da qualsiasi implementazione' IChild'? – user268396

+0

Grazie, ma no, 'Parent 'ha il metodo' Elenco getChild() 'e' IParent' dice che deve restituire una 'Collezione '. Pertanto dovrò fare un cast esplicito nel mio 'ParentEx'. Non voglio modificare i bean autogenerati, quindi l'unico modo per ottenere i bean autogenerati adatti all'interfaccia 'IParent' è scrivere un proprio' ParentEx implements IParent' –

+0

La soluzione con il nuovo ArrayList funziona per te? – Andrejs

risposta

3

Questo dovrebbe funzionare:

return new ArrayList<IChild>(childExList); 

o (non bella, ma evita getto jolly):

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

In Java non è sICURO tipo di gettare Generic<Type> a Generic<SuperType> che è quello che sta cercando di fare per colata List<Child> a Collection<IChild>. Immagina di trasmettere uno List<Integer> a List<Object>, che ti consentirebbe di inserire qualsiasi cosa nella lista, non solo Integer o sottotipi.

È possibile trasmettere Generic<Type> a GenericSuperType<Type> come utente268396 nel commento.

È necessario copiare lo List<Child> in una nuova raccolta, ad es.

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

Si può quindi tornare targetList che può essere inserito implicitamente in Collection<IChild>

Problemi correlati