2012-07-20 14 views
6

Así, según tengo entendido, uno siempre debe programa a una interfaz, como en:programación a una interfaz - evitando el elenco más tarde

List<Integer> list = new LinkedList<Integer>(); 

Así que, más tarde en mi programa tengo:

public List<Integer> getIntegers() { 
    return list; 
} 

public void processIntegers() { 
    // I need an arraylist here 
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast? 
} 

¿Puedo seguir un patrón mejor aquí o de alguna manera hacer algo para evitar el reparto? Casting parece muy feo en este escenario.

Gracias.

+1

También me pregunto por qué esto es mejor que utilizar todo el tiempo una lista de arreglos si al final un lanzamiento es inevitable. – dontcare

+0

@dontcare Para que pueda pasar esta lista de enteros a una función genérica que solo acepta una lista, no específicamente una lista de arrays. – jn1kk

+0

debe programar al tipo menos específico que puede conseguir y no más. – plasma147

Respuesta

7

Ante todo, hágase una pregunta: ¿por qué necesita un ArrayList? Además, ¿los clientes de su API se preocupan por esto? Usted tiene pocas opciones:

  • hacen getIntegers() retorno ArrayList<Integer>. No es un delito

  • Considere requisitos de interfaz menos estrictos, p. Ej. AbstractList como un consenso

  • Crear una copia defensiva de manera que se puede consumir cualquier List:

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers()); 
    

    considerar el uso de instanceof operador para evitar la copia innecesaria si getIntegers() es ya un ArrayList.

En otras palabras - no hay manera de evitar este casting con sus requisitos y en la forma elegante.

Cuestiones relacionadas