recorrer example entre ejemplos ejemplo diferencia java generics map hashmap extends

java - example - No se puede convertir un HashMap<String, String> en una interfaz que extiende Map<String, String>



recorrer hashmap java foreach (2)

HashMap implementó la interfaz Map pero no implementó su interfaz IParams aunque su interfaz derivada de Map , no puede convertirla a IParams ya que no es un tipo de IParams

Esto es probablemente un simple malentendido de mi parte.

Tener una interfaz simple:

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

Luego trato de usar:

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

Aprueba la sintaxis y la compilación, pero en tiempo de ejecución me sale:

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

¿Alguna idea de dónde está mi malentendido de los genéricos en este caso?


HashMap no implementa su interfaz IParams , por lo que no puede convertir un HashMap en 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, algo de someMethod no existe en HashMap . Si funciona un HashMap para 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 tu comentario:

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

Lo que podrías hacer es crear una clase que implemente IParams y amplíe HashMap :

public class Params extends HashMap<String, String> implements IParams { // ... } IParams params = new Params();