2016-08-05 20 views
7

Jak mogę zadeklarować mapę, której klucz może zawierać wyliczenie?Java: Mapa z dowolnym wyliczeniem jako kluczem

Na przykład, mam dwie wyliczone owoce i warzywa.

Jak mogę zadeklarować mapę, gdzie klucz może być zarówno owocowy, jak i warzywny, ale tylko wyliczenia, a nie obiekt?

To znaczy, coś takiego

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

Odpowiedz

18
  1. Jako klucz można użyć java.lang.Enum.

    enum Fruit { 
        Apple 
    } 
    
    Map<java.lang.Enum<?>, String> mp = new HashMap<>(); 
    mp.put(Fruit.Apple, "myapple"); 
    
  2. Utwórz interfejs do zaimplementowania w swoich podsumowaniach. Ta metoda zapewnia większą kontrolę.

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

Proponuję użyć EnumMap zamiast HashMap, ponieważ jest zoptymalizowany dla map z wyliczenia jako kluczy. –

8

Trzeba mieć wspólny dla dwóch supertypem teksty stałe, jeśli chcesz zadeklarować mapę gdzie wystąpienie dwóch typów może być kluczem. Mapa może mieć tylko jeden typ klucza, ale jeśli masz jeden typ z dwoma podtypami, to jest w porządku.

Nie można zmienić klasy nadrzędnej dla wyliczeń (zawsze jest to java.lang.Enum), ale można je zaimplementować w interfejsach. Więc co można zrobić to w ten sposób:

interface FruitOrVegetable { 
} 

enum Fruit implements FruitOrVegetable { 
} 

enum Vegetable implements FruitOrVegetable { 
} 

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

Pytanie brzmi: co to jest wspólne zachowanie teksty stałe owocowych i warzywnych, które można włączyć w interfejsie. Interfejs bez zachowania jest całkiem bezcelowy. Ciągle trzeba wykonywać kontrole i rzutki, aby traktować coś jako Fruit lub .

Być może w twoim przypadku potrzebujesz pojedynczej enum FruitOrVegetable - jeśli chcesz móc traktować je zamiennie.

Powiązane problemy