这可能是我个人的一个简单误解。
有一个简单的界面:
public interface IParams extends Map<String,String> {
}
然后我尝试使用:
IParams params = (IParams) new HashMap<String,String>();
通过语法和编译,但在运行时我得到:
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams
在这种情况下,对我对泛型的误解在哪里有任何见解?
答案 0 :(得分:10)
HashMap
未实现您的界面IParams
,因此您无法将HashMap
投射到IParams
。这与泛型没有任何关系。
IParams
和HashMap
是“兄弟姐妹”,意思是实现或扩展Map
。但这并不意味着您可以将HashMap
视为IParams
。假设您要向IParams
界面添加方法。
public interface IParams extends Map<String, String> {
void someMethod();
}
当然,someMethod
中不存在HashMap
。如果将HashMap
投射到IParams
会有效,如果您尝试调用该方法,您会发生什么?
IParams params = (IParams) new HashMap<String,String>();
// What's supposed to happen here? HashMap doesn't have someMethod.
params.someMethod();
关于你的评论:
目的是创建一个隐藏泛型的接口,并保存(在示例中未显示)映射键字符串定义
您可以做的是创建一个实现IParams
并扩展HashMap
的类:
public class Params extends HashMap<String, String> implements IParams {
// ...
}
IParams params = new Params();
答案 1 :(得分:3)
HashMap
已实施Map
界面,但未实现您的界面IParams
,即使您的界面来自Map
,也无法将其投放到IParams
,因为它不是IParams