Java:使用任何枚举作为键映射

时间:2016-08-05 05:11:01

标签: java generics collections enums

如何声明其键可以包含任何枚举的Map?

例如,我有两个水果和蔬菜。

如何声明地图哪里的钥匙可以是水果和蔬菜,但只有枚举,而不是对象?

我的意思是,像

Map<???, String> myMap...

2 个答案:

答案 0 :(得分:18)

  1. 您可以使用java.lang.Enum作为密钥。

    enum Fruit {
        Apple
    }
    
    Map<java.lang.Enum<?>, String> mp = new HashMap<>();
    mp.put(Fruit.Apple, "myapple");
    
  2. 创建要在枚举中实现的界面。这种方法可以让您获得更多控制权。

    interface MyEnum{}
    
    enum Fruit implements MyEnum {
        Apple
    }
    
    Map<MyEnum, String> mp = new HashMap<>();
    mp.put(Fruit.Apple, "myapple");
    

答案 1 :(得分:8)

如果要声明两个类型的实例可以作为键的映射,则需要为两个枚举设置一个公共超类型。地图只能有一种键类型,但如果你有一种类型有两种子类型,那就没关系。

您无法更改枚举的超类(它总是java.lang.Enum),但您可以使它们实现接口。所以你能做的就是:

 interface FruitOrVegetable {
 }

 enum Fruit implements FruitOrVegetable {
 }

 enum Vegetable implements FruitOrVegetable {
 }

 class MyClass {
     Map<FruitOrVegetable, String> myMap;
 }

问题是:您可以在界面中包含的枚举水果和蔬菜的共享行为是什么。没有行为的界面是毫无意义的。您经常需要进行instanceof检查和强制转换,以便将某些内容视为FruitVegetable

也许在您的情况下,您实际上需要一个枚举FruitOrVegetable - 如果您希望能够互换地对待它们。