无法将HashMap<String,String>转换为扩展Map<String,String>接口的接口

5
这可能是我理解上的简单误解。
拥有一个简单的界面:
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

您能否指出我在这种情况下对泛型的误解是什么?


5
你没有误解泛型,而是误解了继承。 - Marcelo
有延伸 Map 的任何理由吗?你覆盖了哪些方法? - kosa
意图是创建一个隐藏泛型的接口,同时还要保存(在示例中未显示的)地图键字符串定义。 - Matt Thompson
2个回答

11

HashMap没有实现你的接口IParams,所以你不能将HashMap强制转换为IParams。这与泛型无关。

IParamsHashMap是“兄弟”,意思是两者都实现或扩展了Map。但这并不意味着你可以把HashMap当作IParams来处理。假设你要向IParams接口添加一个方法。

public interface IParams extends Map<String, String> {
    void someMethod();
}

当然,HashMap中不存在someMethod方法。如果将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
非常棒的解释,我没有考虑到兄弟节点。我一直试图直接使用HashMap实现,你建议创建一个快速的具体类看起来相当合理。谢谢Jesper。 - Matt Thompson

3

HashMap 实现了 Map 接口,但并没有实现您的接口 IParams,即使您的接口派生自 Map,您也不能将其强制转换为 IParams 类型,因为它不是 IParams 的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接