2012-06-28 30 views
5

Esto es probablemente un simple malentendido de mi parte.No se puede convertir un HashMap <String, String> en una interfaz que extiende Map <String, String>

tener una interfaz sencilla:

public interface IParams extends Map<String,String> { 
} 

entonces trato de usar:

IParams params = (IParams) new HashMap<String,String>(); 

Pases sintaxis y compilar, pero en tiempo de ejecución consigo:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams 

Cualquier penetración en donde mi incomprensión de los genéricos es en este caso?

+5

Usted no se ha malentendido genéricos, que está malinterpretando la herencia . – Marcelo

+0

¿Alguna razón para extender el mapa? ¿Estás anulando cualquier método? – kosa

+0

La intención es crear una interfaz que oculte los genéricos, y también para contener (no se muestra en el ejemplo) las definiciones de cadena de clave de mapa –

Respuesta

10

HashMap no implementa la interfaz de IParams, por lo que no puede emitir un HashMap a un IParams. Esto no tiene nada que ver con los genéricos.

IParams y HashMap son "hermanos", en el sentido de que ambos implementan o extienden Map. Pero eso no significa que pueda tratar un HashMap como si fuera un IParams. Supongamos que agregaría un método a su interfaz IParams.

public interface IParams extends Map<String, String> { 
    void someMethod(); 
} 

Por supuesto, someMethod no existe en HashMap. Si funcionó un HashMap a IParams, ¿qué esperarías que ocurriera si intentas llamar al método?

IParams params = (IParams) new HashMap<String,String>(); 

// What's supposed to happen here? HashMap doesn't have someMethod. 
params.someMethod(); 

Con respecto a su comentario:

La intención es crear una interfaz que oculta los genéricos, y también para mantener (no se muestra en el ejemplo) mapear la cadena de caracteres clave

Lo que podría hacer es crear una clase que implementa IParams y se extiende HashMap:

public class Params extends HashMap<String, String> implements IParams { 
    // ... 
} 

IParams params = new Params(); 
+1

Explicación fantástica, no estaba pensando en términos de hermanos. Estaba tratando demasiado de usar la implementación de HashMap directamente y su sugerencia de crear una clase rápida y concreta parece bastante razonable. Gracias Jesper. –

3

HashMap implementado Map interfaz pero no se aplica a su interfaz IParams aunque interfaz derivada de Map, no se puede convertir a IParams ya que no es un tipo de IParams

Cuestiones relacionadas