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

Mat*_*son 5 java generics extends hashmap map

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

有一个简单的界面:

public interface IParams extends Map<String,String> {
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用:

IParams params = (IParams) new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)

通过语法和编译,但在运行时我得到:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我对我对泛型的误解在哪里有所了解?

Jes*_*per 10

HashMap没有实现你的界面IParams,所以你不能强制HashMap转换为IParams.这与泛型没有任何关系.

IParams并且HashMap是"兄弟姐妹",在实施或延伸的意义上Map.但这并不意味着你可以把它HashMap视为一个IParams.假设您要在IParams界面中添加方法.

public interface IParams extends Map<String, String> {
    void someMethod();
}
Run Code Online (Sandbox Code Playgroud)

当然,someMethod不存在HashMap.如果使用HashMapto to IParamswork,如果你试图调用该方法,你会发生什么?

IParams params = (IParams) new HashMap<String,String>();

// What's supposed to happen here? HashMap doesn't have someMethod.
params.someMethod();
Run Code Online (Sandbox Code Playgroud)

关于你的评论:

目的是创建一个隐藏泛型的接口,并且还保持(在示例中未显示)映射键字符串定义

你可以做的是创建一个实现IParams和扩展的类HashMap:

public class Params extends HashMap<String, String> implements IParams {
    // ...
}

IParams params = new Params();
Run Code Online (Sandbox Code Playgroud)