簡體   English   中英

EnumMap和Java泛型

[英]EnumMap and Java Generics

假設我有兩個枚舉:

enum MyEnum {A, B, C};
enum YourEnum {D, E, F};

和兩個非常相似的類:

class MyRow {
  EnumMap<MyEnum, Object> map;
}

class YourRow {
  EnumMap<YourEnum, Object> map;
}

有沒有辦法做這樣的事情呢?

class Row<T implements Enum> {
  EnumMap<T, Object> map;
}

這樣我可以說Row<MyEnum>Row<YourEnum>嗎? 我只是不想為每個這些特定的枚舉定義一個新的Row類(我有幾十個)。

從您的示例看來,您可能正在尋找類似

class Row<T extends Enum<T>> {
    EnumMap<T, Object> map;
}

您可以使用此類,例如

Row<MyEnum> row = new Row<>();
row.map.put(MyEnum.A, "foo");//OK
//row.map.put(YourEnum.D, "bar");// Error, `put` from this reference 
                                 // is meant to handle `MyEnum`

在Row類中,似乎沒有讓我以標准方式遍歷值:

for (T col : T.values())

T是泛型類型, 在運行時將其擦除Object而Object沒有values()方法。 也許您應該考慮包括Class<T>字段,該字段將在運行時存儲您正使用的Enum的信息。 此類具有getEnumConstants()方法,該方法類似於values()方法。

所以你的代碼看起來像

class Row<T extends Enum<T>> {
    EnumMap<T, Object> map;
    Class<T> enumType;

    public Row(Class<T> enumType){
        this.enumType = enumType;
    }

    void showEnums(){
        for (T col : enumType.getEnumConstants())
            System.out.println(col);
    }
}

可以用這種方式

Row<MyEnum> row = new Row<>(MyEnum.class);
row.showEnums();

請嘗試這樣

public class Row<T extends Enum<T>> {

    EnumMap<T, Object> objs;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM