如何将一组Map键转换为Array List

时间:2014-10-02 23:56:42

标签: java

如何将Map的键集合作为数组列表?

我正在按如下方式初始化地图:

Map foo = new HashMap<Character,Integer>();

添加值后,我试图将我的密钥放入ArrayList中,如下所示:

ArrayList<Character> bar = new ArrayList<Character>(foo.keySet());

但是,编译器抛出以下错误:

warning: [unchecked] unchecked conversion
ArrayList<Character> bar = new ArrayList<Character>(foo.keySet());
                                                                      ^
required: Collection<? extends Character>
found:    Set

我知道它需要转换密钥集,但我不知道如何实现它,因为我看到的keySet()的所有示例都遵循我使用过的方法。

3 个答案:

答案 0 :(得分:0)

只需使用泛型来声明foo

Map<Character,Integer> foo = new HashMap<Character,Integer>();

然后,foo.keySet()将拥有正确的通用类型Set<Character>,从而解决问题。

答案 1 :(得分:0)

您的Map foo引用不是通用的(它是原始的),因此编译器无法安全地假设它始终保持HashMap<Character,Integer>(它也可以保存HashMap<String,Integer>)。

因此foo.keySet()不会返回通用Set<Character>,而是返回原始Set,但是 ArrayList<Character>的构造函数需要收集Character(或来自字符的派生类型集合 - 换言之Collection<? extends Character>),原始Set无法表示。

要解决此问题,您需要通过

foo引用中明确设置泛型类型
Map<Character, Integer> foo = new HashMap<Character, Integer>();
// ^^^^^^^^^^^^^^^^^^^^ - add this

答案 2 :(得分:-1)

您需要一个集合而不是列表来存储您的密钥

Set<Character> bar = new HashSet<Character>(foo.keySet());