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

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

4

2 回答 2

10

HashMap不实现您的接口IParams,因此您不能将 aHashMap转换为IParams. 这与泛型无关。

IParams并且HashMap是“兄弟姐妹”,从实现或扩展的意义上说Map。但这并不意味着您可以将 aHashMap视为一个IParams。假设您要向IParams界面添加一个方法。

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

当然,someMethod不存在于HashMap. 如果强制转换 a HashMaptoIParams可行,那么如果您尝试调用该方法,您会期望发生什么?

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();
于 2012-06-28T14:25:08.630 回答
3

HashMap已实现Map接口但未实现您的接口IParams即使您的接口派生自Map,您也不能将其转换IParams为,因为它不是IParams

于 2012-06-28T14:26:02.293 回答