可以将不同枚举中的键添加到Java中的EnumMap吗?

时间:2013-10-16 12:14:38

标签: java enums enum-map

我必须使用java枚举,A和B,以及EnumMap是否可以将A和B中的键添加到此映射中?

EnumMap<? extends Enum,Object> enumMap = new EnumMap(Enum.class);

Object o1 = new Object();
Object o2 = new Object();

Enum e1 = A.X
Enum e2 = B.X
enumMap.put(e1,o1)
enumMap.put(e2,o2)

我试过没有成功,有什么我做错了吗?

3 个答案:

答案 0 :(得分:1)

使用不同的枚举作为地图的键不起作用。来自documentation

  

枚举映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型。

您需要使用其他地图实现。

答案 1 :(得分:0)

您可以通过以下方式尝试。请考虑以下示例。

public enum EnumA {
typeA("1");
 EnumA(String s) {
 }

}

public enum EnumB {
typeB("2");

 EnumB(String s) {
}

}

现在您可以按如下方式创建Map。

    Map<Enum,String> enumMap=new HashMap<>();
    enumMap.put(EnumA.typeA,"a");
    enumMap.put(EnumB.typeB, "b");

    System.out.println(enumMap);

答案 2 :(得分:0)

我发现了你的问题,并且我想解释为什么不能使用不同的枚举作为地图的关键。

为了做到这一点,我们首先要研究EnumMap的实现。在Java中,EnumMap只是一个带有值对象数组的对象。让我们假设这个例子:

你有你的Enum-class Colors

enum Colors { 
    BLUE,
    RED,
    YELLOW;
}

和一个在EnumMap中存储一些彩色水果的类:

class MyClass { 
    EnumMap<Colors, String> coloredFruits = new EnumMap<>(Colors.class);

    void main() { 
        coloredFruits.put(Colors.RED, "Apple");
        coloredFruits.put(Colors.BLUE, "Grape");
        coloredFruits.put(Colors.YELLOW, "Banana");
    }
}

Java现在所做的是使用以下数组创建一个新的EnumMap对象:

String[] values = { "Grape", "Apple", "Banana" }

这正是使EnumMap如此高效的原因。它实际上只不过是一个具有值对象数组的对象和一些存储该类的字段(在我们的示例中将是Class keyType = Colors.class)。为了使其按预期工作,只能有一个keyType类。