2011-08-19 8 views
7

¿Hay alguna forma de convertir una lista de tipos concretos en una lista de sus interfaces en Java?Emitir una lista de tipos concretos a una lista de sus interfaces en Java

Por ejemplo:

public class Square implements Shape { ... } 

public SquareRepository implements Repository { 

    private List<Square> squares; 

    @Override 
    public List<Shape> getShapes() { 
    return squares; // how can I return this list of shapes properly cast? 
    } 

} 

Gracias de antemano,

Caps

Respuesta

11

Puede hacer uso de la generic wildcards para permitir listas de derivados para ser utilizados como listas de base:

public List<? extends Shape> getShapes() { ... } 

Tenga en cuenta que la lista devuelta no puede tener elementos no nulos añadidos a él. (Como señala el Sr. Sauer, puede agregar null y la eliminación también está bien.) Esa es la compensación, aunque con suerte eso no importará en su caso.

Dado que getShapes() es una anulación, también deberá actualizar el tipo de devolución en Repository.

+1

"* No se puede escribir a *" no es * completo * precisa: se todavía puede agregar 'null' y eliminar elementos. –

+0

Gracias. Actualizado para reflejar eso. – dlev

+0

¿Qué pasa si "eso" importa en mi caso? – osrl

3

Si usted está en control de la interfaz Repository, le sugiero que refactorizar para volver algo del tipo List<? extends Shape> lugar.

Este compila bien:

interface Shape { } 

class Square implements Shape { } 

interface Repository { 
    List<? extends Shape> getShapes(); 
} 

class SquareRepository implements Repository { 
    private List<Square> squares; 

    @Override 
    public List<? extends Shape> getShapes() { 
     return squares; 
    } 
} 
4

Si realmente quieres hacer esto algo así como el siguiente podría funcionar

@Override 
public List<Shape> getShapes() { 
    return new ArrayList<Shape>(squares); 
} 
+0

Me gusta. Mucho más limpio que tratar con "? Extends" – yurgis

+0

Tenga en cuenta que esto crea una copia de la lista. Puede ser relevante para listas largas y/o aplicaciones de tiempo crítico. –

Cuestiones relacionadas