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

Pav*_*l_K 8 java generics collections enums

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

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

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

我的意思是,像

Map<???, String> myMap...
Run Code Online (Sandbox Code Playgroud)

afz*_*lex 18

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

    enum Fruit {
        Apple
    }
    
    Map<java.lang.Enum<?>, String> mp = new HashMap<>();
    mp.put(Fruit.Apple, "myapple");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建要在枚举中实现的界面.此方法为您提供更多控制.

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


Erw*_*idt 8

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

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

 interface FruitOrVegetable {
 }

 enum Fruit implements FruitOrVegetable {
 }

 enum Vegetable implements FruitOrVegetable {
 }

 class MyClass {
     Map<FruitOrVegetable, String> myMap;
 }
Run Code Online (Sandbox Code Playgroud)

问题是:您可以在界面中包含的枚举水果和蔬菜的共享行为是什么.没有行为的界面是毫无意义的.你经常需要做一些instanceof检查和演员表来处理某事Fruit或作为Vegetable.

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