【问题标题】:How to cast a Hashmap to Map [duplicate]如何将Hashmap转换为Map [重复]
【发布时间】:2015-06-01 11:07:27
【问题描述】:

我想投一个哈希图:

我的代码:

public class Example {

private HashMap<MyItem, Integer> items =new HashMap<MyItem, Integer>();


@Override
public Map<Item, Integer> gItems() {
    return this.items;
}

}

MyItem 是一个继承自 Item 类的类。

这段代码给我一个编译错误。

由于多种原因,我无法使用该解决方案来更改返回方法的类型。

那么我该如何将我的 HashMap&lt;MyItem, Integer&gt; 转为 Map&lt;Item, Integer&gt;

我得到的错误是: 类型不匹配:无法从HashMap&lt;MyItem, Integer&gt; 转换为Map&lt;Item, Integer&gt;

编译器要求我更改返回方法的类型。

谢谢。

【问题讨论】:

  • 请发布错误。
  • 谷歌“为什么泛型不是协变的?”
  • 问题不是HashMap -&gt; Map,而是&lt;MyItem&gt; -&gt; &lt;Item&gt;。它们之间有什么关系?也许你可以使用有界通配符
  • 我说 MyItem 继承自 Item

标签: java dictionary data-structures collections hashmap


【解决方案1】:

编辑:查看 testinfected 的回答,它是正确的/更有意义。

如果调用您的代码无法处理实现所需接口的类型,则您的堆栈中可能存在更高的问题,但您可以像这样进行转换:

return (Map)this.items;

【讨论】:

  • 这并不能解决问题。他不需要强制转换继承类。问题是返回类型是 Map 而实例类型是 HashMap。请注意,一个使用“Item”作为键,一个使用“MyItem”作为键。
【解决方案2】:

您将无法投射,因为Map&lt;MyItem, Integer&gt; 不是Map&lt;Item, Integer&gt; 的子类型。这在generics tutorial 中有详细描述(请参阅泛型和子类型部分)。

在这种情况下你可以做的是让你的函数返回一个Map&lt;? extends Item, Integer&gt;

【讨论】:

  • 谢谢,我遇到的问题是,当我对集合执行 put 操作时,即使它已经在 hashmap 中,它也会被添加。因为我正在尝试使用MyItem 作为 hashmap 中的键。
  • 我不确定我是否理解您的评论。你还有什么问题?可以保持map的声明不变,只是改变函数的返回类型
  • 无论如何谢谢你,我认为在我的情况下这是不可能的
猜你喜欢
  • 2018-04-12
  • 2016-01-18
  • 2015-01-14
  • 1970-01-01
  • 2017-07-14
  • 2011-12-09
  • 2016-12-07
  • 2017-03-22
  • 2011-12-02
相关资源
最近更新 更多