2009-09-22 18 views
10

Supongamos que tengo una clase que implementa una interfaz:lista de objetos Java que toda implementar una interfaz

public class A implements IB 

y tengo una List<A> que me gustaría hacer referencia a: List<? implements IB> list. Para que pueda codificar: for (IB item : list) etc.

¿Se puede hacer de alguna manera en Java? No hay posibilidad de <? implements ...>. ¿Qué me estoy perdiendo?

+1

¿Quiere decir IA? cuando dices IB? – OscarRyz

Respuesta

3

Si usted significó que la clase A implementa IA, en lugar de IB, a continuación, el código debe estar muy bien diciendo

for (A item : list) { 
    // handle item as if it is an IA 
} 

como todos Como son, por definición IAs.

Mientras tanto, no hay ningún comodín para <? implements C>. Hay <? extends C>, y C puede ser una interfaz o una clase; sin embargo, esto no es necesario para lo que parece que estás tratando de hacer.

Si desea expresamente que decir for (IA item : list) porque no estás garantizando que los elementos de esa lista son A s, pero está garantizando que son IA s, entonces yo creo que hay un pequeño problema (no puedo decir con seguro, ya que no dijiste dónde se encuentra este código de procesamiento de lista). A List<A> es no a List<IA> por definición; si está compilando un List<A> y luego pasándolo a un método que espera un List<IA>, obtendrá un error de tiempo de compilación. Sin embargo, puede crear un List<IA> y completarlo con A s. La razón de esto se explica en el tutorial de Java sobre genéricos.

+0

¿Qué estaba pensando? Funciona perfectamente bien porque en C también puede ser una interfaz. Pensé 'extiende' <=> herencia. – Gerard

1

Bueno, podría declararlo List<IA>.

Para continuar con esto, List puede almacenar cualquier objeto que implemente IA en él. El problema es que, al recuperarlos, no conoce la clase original sin hacer un .getClass() en ella.

Ejemplo:

List<IA> list = new ArrayList<IA>(); 
// code to populate list here 
for (IA item : list) { 
    item.iaMethod(); 
} 
18

Uso extends:

public void someMethod(List<? extends IB> list) { 
    for (IB e : list) { 
    // Perform some processing on each element. 
    } 
} 

public void anotherMethod() { 
    List<A> list = new ArrayList<A>(); 
    someMethod(list); 
} 

Más información se puede encontrar en The Java Tutorials que tiene una comprehensive lesson on Generics.

En particular, el section on wildcards explica cómo utilizar el ? con super y extends para especificar un parámetro que ser uno que es una superclase o subclase de una clase dada.

+0

También recomiendo la sesión de Joshua Bloch de JavaOne este año para más información. Realmente lo aclaró para mí: http: // developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5217.pdf – amischiefr

+0

Gracias por la respuesta. – Gerard

7

¿Qué hay de:

List<? extends IA> list; 
2

Puede hacerlo con extends:

List<? extends IA> list 
Cuestiones relacionadas