无法将HashMap <string,string>强制转换为扩展Map <string,string> </string,string> </string,string>的接口

时间:2012-06-28 14:22:55

标签: java generics map hashmap extends

这可能是我个人的一个简单误解。

有一个简单的界面:

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

在这种情况下,对我对泛型的误解在哪里有任何见解?

2 个答案:

答案 0 :(得分:10)

HashMap未实现您的界面IParams,因此您无法将HashMap投射到IParams。这与泛型没有任何关系。

IParamsHashMap是“兄弟姐妹”,意思是实现或扩展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

的类型