2012-03-12 6 views
7

Tengo algunos beans generados JAXB que están en una estructura jerárquica, p. un frijol tiene una lista de otros frijoles. Ahora quiero extender algún elemento hijo y también el elemento padre que contiene los hijos extendidos.JAXB extienden el código generado con la fábrica de objetos extendidos: ¿los moldes explícitos son buenos?

Mi ParentEx implementa alguna otra interfaz IParent que se espera que devuelva Collection<IChild>. Mi ChildEx implementa IChild. ¿Puedo devolver un (Collection<IChild>)super.getChild() cuando super.getChild() devuelve List<Child>? ¿O hay una forma más agradable de hacer esto?

  • Child y Parent son JAXB genera granos
  • ChildEx y ParentEx son mis propios granos para el mapeo de los granos de JAXB a las interfaces dadas. Ambos granos anulan la ObjectFactory
  • IChild y IParent son las interfaces necesarias de alguna otra biblioteca

Editar: Eclipse ni siquiera dejar que mi elenco de List<Child> a List<ChildEx> así que tengo que añadir un poco de comodín intermediario fea cast (List<ChildEx>)(List<?>)super.getChild()

+1

¿Por qué tendrías que hacer esto? 'List ' "es una' 'Colección ' en cualquier caso. A menos que me falta lo obvio, la interfaz 'IParent' está totalmente satisfecha con cualquier implementación de' IChild' también? – user268396

+0

Gracias, pero no, el 'Parent' tiene el método' List getChild() 'y el' IParent' dice que debe devolver 'Collection '. Por lo tanto, tendré que hacer un lanzamiento explícito en mi 'ParentEx'. No quiero modificar los beans autogenerados, por lo tanto, la única forma de obtener beans generados automáticamente para la interfaz 'IParent' es escribir un' ParentEx implements IParent' –

+0

¿La solución con ArrayList funciona para ti? – Andrejs

Respuesta

3

Esto debería funcionar:

return new ArrayList<IChild>(childExList); 

o (no es bonito pero evita fundido comodín):

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

En Java no es un tipo seguro para echar a Generic<Type>Generic<SuperType> que es lo que está tratando de hacer por colada List<Child> a Collection<IChild>. Imagine un List<Integer> siendo lanzado a List<Object>, que le permitiría poner cualquier cosa en la lista, no solo Integer o subtipos.

Es seguro para emitir Generic<Type> a GenericSuperType<Type> como user268396 señala en el comentario.

Va a necesitar copiar el List<Child> en una nueva colección, p.

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

A continuación, puede volver targetList que se puede convierte implícitamente a Collection<IChild>

Cuestiones relacionadas