【问题标题】:Unable to cast a HashMap<String,String> to a Interface extending Map<String,String>无法将 HashMap<String,String> 转换为扩展 Map<String,String> 的接口
【发布时间】:2012-06-30 02:22:20
【问题描述】:

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

有一个简单的界面:

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

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

【问题讨论】:

  • 你不是误解泛型,你是误解继承。
  • 有什么理由扩展地图吗?您是否覆盖了任何方法?
  • 目的是创建一个隐藏泛型的接口,并保存(示例中未显示)映射键字符串定义

标签: java generics map hashmap extends


【解决方案1】:

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();

【讨论】:

  • 奇妙的解释,我没有考虑兄弟姐妹。我太努力直接使用 HashMap 实现,您创建快速具体类的建议看起来很合理。谢谢杰斯珀。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2016-07-21
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多