簡體   English   中英

無法找出HashMap的正確類型

[英]Can't figure out the correct type for a HashMap

filter.put("a", EnumA.class);I got following setup:

public interface InterfaceA {
  abstract public Object[] foo();
}

public enum EnumA implements InterfaceA {
  RED();
  ...
}

public enum EnumB implements InterfaceA {
  OAK();
  ...
}

現在我想使用這個構造typesave,我得到了這個:

private <T extends Enum<T> & InterfaceA> void  importSettingViaEnum(Class<T> clazz) { ...
    for (T elem : clazz.getEnumConstants()){
        ... = f(elem.ordinal());
        ... = elem.foo();
        ...
    }
}

這似乎是正確的,clazz應該只在上面的枚舉工作。 但現在,我無法弄清楚這張地圖的正確類型,這是行不通的:

public <T extends Enum<T> & InterfaceA> Main() {
    Map<String, Class<T>> filter = new HashMap<>();
    filter.put("a", EnumA.class);
    filter.put("b", EnumB.class);
    importSettingViaEnum(filter.get("a"));
}

有人有線索嗎? 我希望這個東西是類型安全的。

這里有一些pastebin: https//pastebin.com/fKxtBGBe


編輯1:

嘗試過類似的東西,但它不會起作用......

public Main() {
        Map<String, Class<? extends Enum<? extends InterfaceA>>> filter = new HashMap<>();
        filter.put("a", EnumA.class);
        filter.put("b", EnumB.class);
        importSettingViaEnum(filter.get("a")); // BREAK THE BUILD
    }

Type erasure ...提供泛型類型參數的類型對象。

public <T extends Enum<T> & InterfaceA> void main(Class<T> type) {
    Map<String, Class<T>> filter = new HashMap<>();
    filter.put("a", type);
    //importSettingViaEnum(filter.get("a"));
}

    main(EnumA.class);

這也解耦了實現類型(EnumA)。


或者選擇部分類型安全

public void main2() {
    Map<String, Class<? extends InterfaceA>> filter = new HashMap<>();
    filter.put("a", EnumA.class);
    Class<? extends InterfaceA> type = filter.get("a");
    if (type.isEnum()) {
        ....
    }
}

如果需要,將類型轉換為Enum。

如果你想創建一個sting到一個類的地圖,這應該適合你:

Map<String, Class> filter = new HashMap<>(); // any Class put against a string in the map
filter.put("a", EnumA.class);

暫無
暫無

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

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