2011-06-08 6 views
7

Tengo este bit de observaciones (contra-intuitivas) sobre la notación comodín genérica utilizada en colecciones. El propósito de la notación comodín List<? extends T> es permitir la asignación de una lista (de subtipos de T) a la referencia de la lista de '? de T '. Su propósito no es específicamente permitir la adición de elementos de subtipos de T a la Lista (de '? De T'), lo cual es posible incluso en un List<T>.¿Intención principal o propósito de la notación comodín? extiende T '

List<Number> list = new ArrayList<Integer>(); // invalid , List<Integer> is not assignable to List<Number> 

    List<Number> list = new ArrayList<Number>() ; // OK 

    list.add(new Integer(1)); // valid , '? extends Number' not needed! 

    List<? extends Number> list1 = new ArrayList<Integer>(); // Valid , because of notation '? extends Number' 

¿Es correcta mi observación?

+0

¿Intentaste compilarlo? – Kaj

+0

@Kaj, sí, y he indicado los errores de compilación en las líneas respectivas – Bhaskar

Respuesta

8

Sí, su observación es correcta. Sin embargo, en el caso que muestre, no es muy útil (está eligiendo ignorar información útil sobre la lista). La asignación es más útil cuando está implícita cuando llamas a una función de biblioteca.

Por ejemplo, supongamos que tiene una función de biblioteca que cerró una colección de InputStreams. Puede aceptar List<InputStream>, pero eso es innecesariamente restrictivo. En su lugar podría hacer esto:

public void closeAll(Collection<? extends InputStream> streams) { 
    for (InputStream stream : streams) { 
     stream.close(); 
    } 
} 

Ahora usted puede pasar en un lugar List<FileInputStream>.

+3

¿Podría incluso hacer esa 'Colección ', haciendo que funcione para' OutputStream's también. – ColinD

Cuestiones relacionadas