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();