2016-08-05 103 views
7

Wie kann ich Map deklarieren, deren Schlüssel eine Enum haben kann?Java: Karte mit einer beliebigen Enumeration als Schlüssel

Zum Beispiel habe ich zwei enum Obst und Gemüse.

Wie kann ich map deklarieren, wo Schlüssel sowohl Obst als auch Gemüse sein kann, aber nur Aufzählungen, nicht Objekt?

Ich meine, so etwas wie

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

Antwort

18
  1. Sie können als Schlüssel verwenden.

    enum Fruit { 
        Apple 
    } 
    
    Map<java.lang.Enum<?>, String> mp = new HashMap<>(); 
    mp.put(Fruit.Apple, "myapple"); 
    
  2. erstellen Schnittstelle in Ihrer Aufzählung umgesetzt werden. Diese Methode gibt Ihnen mehr Kontrolle.

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

Ich würde vorschlagen, ein EnumMap anstelle einer HashMap zu verwenden, wie es für Karten mit Enum als Schlüssel optimiert ist. –

8

Sie benötigen einen gemeinsamen Supertyp für Ihre zwei Aufzählungen haben, wenn Sie eine Karte erklären wollen, wo Instanz von zwei Typen kann der Schlüssel sein. Eine Map kann nur einen Schlüsseltyp haben, aber wenn Sie einen Typ mit zwei Subtypen haben, ist das in Ordnung.

Sie können die Superklasse für Enums nicht ändern (es ist immer java.lang.Enum), aber Sie können sie Schnittstellen implementieren implementieren. Also, was können Sie tun, ist dies:

interface FruitOrVegetable { 
} 

enum Fruit implements FruitOrVegetable { 
} 

enum Vegetable implements FruitOrVegetable { 
} 

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

Die Frage ist: Was ist das gemeinsame Verhalten der Aufzählungen Obst und Gemüse, die Sie in der Schnittstelle enthalten. Eine Schnittstelle ohne Verhalten ist ziemlich sinnlos. Sie müssten ständig instanceof Prüfungen und Gussstücke machen, um etwas als Fruit oder Vegetable zu behandeln.

Vielleicht in Ihrem Fall brauchen Sie tatsächlich eine einzige enum FruitOrVegetable - wenn Sie in der Lage sein möchten, sie austauschbar zu behandeln.