2010-12-16 10 views
7

Diseño simple y sencillo código pero no se compila:Java: interfaz en la recolección no se reconoce como parámetro

public interface Insertable { 
    public String getInsertStmt(String table); 
} 

public class ClassCanBeInserted implements Insertable { 
    public String getInsertStmt(String table) {} 
} 

public class SomeClass { 
    public static void main() { 
     List<ClassCanBeInserted> list = new ArrayList<ClassCanBeInserted>(); 
     SomeMethod(list); 
    } 
    private static void SomeMethod(List<Insertable> list) {} 
} 

Y la llamada a SomeMethod() no se compilará. Inglés pobre pero el código debería explicar. ¿Puede alguien averiguar qué es lo que falla y cómo obtener un diseño para proponer que se pueda utilizar una lista de clases implementadas en la interfaz en dicho método?

Nuevamente, inglés pobre, por lo que puede que no se exprese bien. Déjame saber tus preguntas. ¡Gracias! mensaje

error dado: El método SomeMethod (Lista) en el tipo ClassCanBeInserted no no es aplicable a los argumentos (Lista)

Respuesta

13

List<Insertable> es una superclase de List<ClassCanBeInserted>, a pesar de que Insertable es una superclase de ClassCanBeInserted. Para hacer lo que quiera, debe cambiar la firma SomeMethod al SomeMethod(List<? extends Insertable> list).

+0

¡Gracias! Funciona, y la respuesta es clara y precisa. –

+0

Gracias, esto me ayudó a resolver mi problema. Además, si en su función desea declarar un objeto del tipo genérico, puede declarar su función con 'public static void SomeMethod (Lista list) {}'. A continuación, puede declarar una variable de ese tipo con 'T varName;' –

1

Esto parece contra intuitivo al principio.

Creo que la razón es que el objetivo de los genéricos es introducir y restringir la lista en función de la seguridad de tipo estático.

Si pudieras poner cualquier 'Insertable' en la lista, podrías terminar con una mezcla de diferentes tipos de clases contenidos allí.

Esto significa que se vuelve inseguro y está en riesgo de ClassCastExceptions.

+0

Vea también http://stackoverflow.com/questions/2745265/why-arent-javas-generics-implicitly-polymorphic –

Cuestiones relacionadas