2016-08-05 16 views
7

どのようにキーが列挙型を持つことができるマップを宣言できますか?Java:任意の列挙型をキーとしてマップ

たとえば、私は2つの列挙型の果物と野菜を持っています。

キーは果物と野菜の両方にできますが、オブジェクトではなく列挙のみのマップを宣言するにはどうすればよいですか?

私は、あなたが2種類のインスタンスがキーすることができマップを宣言したい場合は、あなたの2つのenumのための共通のスーパータイプを持っている必要があります

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

答えて

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"); 
    
+0

私はそれがキーとして列挙型とマップのために最適化されたとして、代わりにHashMapのEnumMapを使用することをお勧めします。 –

8

のようなものを意味します。マップにはキータイプは1つしかありませんが、サブタイプが2つのタイプが1つの場合はOKです。

enum(常にjava.lang.Enum)のスーパークラスを変更することはできませんが、インターフェイスを実装できるようにすることができます。それでは、あなたにできることはこれです:

interface FruitOrVegetable { 
} 

enum Fruit implements FruitOrVegetable { 
} 

enum Vegetable implements FruitOrVegetable { 
} 

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

質問です:あなたがインターフェイスに含めることができ、列挙型の果物と野菜の共有行動は何ですか。動作のないインタフェースはかなり無意味です。あなたは常にinstanceofのチェックとキャストをして、何かをFruitまたはVegetableとして扱う必要があります。

場合によっては実際には単一の列挙型FruitOrVegetableが必要です。それらを同じ意味で扱いたい場合は、

関連する問題