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