【问题标题】:Map<Enum, Integer> map2 = new EnumMap<what-to-write-to-make-compile???>(map1);Map<Enum, Integer> map2 = new EnumMap<what-to-write-to-make-compile???>(map1);
【发布时间】:2017-01-22 16:30:17
【问题描述】:

类枚举在 API 中定义为:

public abstract class Enum<E extends Enum<E>>

我有

enum Cards { Trefs(2.3), Clubs(1.0);
    public double d;

    private Cards(double val) {
        this.d = val;
    }       
}   

问题一:

Enum e = Cards.Clubs; //compiles, but with warning: "References to generic type Enum<E> should be parameterized"

Enum<???what-shall-I-write-here??> e1 = Cards.Clubs; //Question 1

问题 2:

编译:

        Map<Enum, Integer> map0 = new HashMap<Enum, Integer>();
        Map<Enum, Integer> map1 = new HashMap<Enum, Integer>();
        map1.put(Cards.Clubs, new Integer(54));

        Map<Enum, Integer> map2 = new EnumMap<>(map1);

但是我可以在 RHS(新 EnumMap)的尖括号中添加任何内容,就像我为上面的 map1 所做的那样吗?

Map<Enum, Integer> map2 = new EnumMap<???what-can-I-write-here??>(map1);

附:我研究了 SO,但没有发现 直接 回答上述问题。 我的研究:

  1. angelikalanger FAQ
  2. this
  3. this
  4. this
  5. this

【问题讨论】:

  • 尝试使用 IDE,它几乎可以满足所有需求。

标签: java generics enums


【解决方案1】:

首先:请改用这个:

Cards e = Cards.Clubs;

第二:使用diamond operator。如果你绝对想要,那就是new EnumMap&lt;Cards, Integer&gt;(),但你为什么要写出来呢? 请不要使用new Integer(54)。如果出于某种原因您不喜欢autoboxing,请改用Integer.valueOf(54)It doesn't waste objects.

所以,我推荐这个代码:

Map<Cards, Integer> map0 = new HashMap<>();
Map<Cards, Integer> map1 = new HashMap<>();
map1.put(Cards.Clubs, 54);

Map<Cards, Integer> map2 = new EnumMap<>(map1);

【讨论】:

    【解决方案2】:

    第一件事是:

    Enum<Cards> e = Cards.Clubs;
    
    Map<Enum<Cards>, Integer> map0 = new HashMap<>();
    Map<Enum<Cards>, Integer> map1 = new HashMap<>();
    map1.put(Cards.Clubs, 54);
    

    但我不知道为什么 Map&lt;Enum&lt;Cards&gt;, Integer&gt; map2 = new EnumMap&lt;&gt;(map1); 失败

    编辑:

    所以我认为你想要的是这样的:

    Cards e = Cards.Clubs;
    
    Map<Cards, Integer> map0 = new HashMap<>();
    Map<Cards, Integer> map1 = new HashMap<>();
    map1.put(Cards.Clubs, 54);
    
    EnumMap<Cards, Integer> map2 = new EnumMap<>(map1);
    

    您不需要将 Enum 包装到 Enum 中

    【讨论】:

    • 令人惊讶的是,Enum&lt;Cards&gt; e = Cards.Clubs; 给出了警告“枚举是原始类型。对泛型类型 Enum 的引用应该被参数化”。有没有办法在没有警告的情况下写这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2022-12-02
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多