2010-07-23 51 views
2

我有一個類EnumConverter<T extends Enum<?>>,它將字符串轉換爲枚舉的正確枚舉常量T(我不能使用Enum.valueOf)。我建立這個類的實例的工廠方法是這樣的:具有泛型的靜態工廠方法

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) { 
    return new EnumConverter<T>(enumClass.getEnumConstants()); 
} 

這工作,但現在我想緩存EnumConverter實例,以確保只有每個enum帶有Map一個,即,我的問題是,如何申報Map。我來最接近的是這樣的:

private static final Map<Class<?>, EnumConverter<? extends Enum<?>>> 

,但我得到一個錯誤,如果我試圖從我的工廠方法返回從這個Map值:

Type mismatch: cannot convert from EnumConverter<capture#1-of ? extends Enum<?>> to EnumConverter<T>

任何想法?

回答

2

由於您想要在地圖中存儲不同的子類型,編譯器無法知道您正在接收哪個實際的子類型。我認爲你必須添加一個演員陣容:

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) { 
    return (EnumConverter<T>) cache.get(enumClass); 
} 
+0

謝謝,這有效!但我仍然得到一個警告:'類型安全:從EnumConverter <捕獲#3的未檢查的轉換?將Enum >擴展爲EnumConverter '。但由於類型擦除,這可能無法解決? – hakos 2010-07-23 10:36:50

+0

答案確實是'@SuppressWarnings(「unchecked」)':http://stackoverflow.com/questions/262367/type-safety-unchecked-cast – hakos 2010-07-23 10:51:03