2012-08-01 78 views
0

我有類似的東西:Java靜態通用的HashMap

private static LinkedHashMap<Class<?>, ?> configFiles; 

和靜態方法:

@SuppressWarnings("unchecked") 
public static <T> T getConfigFile(Class<T> clazz) throws Exception { 

    return (T) configFiles.get(clazz); 
} 

,但我有init方法:

configFiles = new LinkedHashMap<Class<T>, T>(); 

並且它沒有編譯:/

但是,如果我做這樣的事情:

@SuppressWarnings("unchecked") 
    @Override 
    public void intitConfigFiles() 
     throws ClassNotFoundException, ConfigurationFilesException 
    { 
     configFiles = new LinkedHashMap<Class<?>, T>(); 
    } 

它的工作,但我不知道怎麼用put方法:/

Class<T> clazz = (Class<T>) Class.forName(prop.getValue()); 

    jc = JAXBContext.newInstance(clazz); 
     u = jc.createUnmarshaller(); 
     configFiles.put(clazz, u.unmarshal(inputStream)); 

,我已經在Eclipse中遇到錯誤我不知道懂得如何正確使用put方法?

+0

請提供給我們您收到的錯誤消息。 – 2012-08-01 12:53:11

+0

你在這行u.unmarshal(inputStream)中有沒有捕獲異常? – 2012-08-01 12:54:23

+0

您可能有興趣使用Guava的['ClassToInstanceMap'](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ClassToInstanceMap.html),它爲這類事情實現了一個類型安全的包裝器。 – 2012-08-01 12:55:23

回答

1

configFiles應該是LinkedHashMap<Class<?>, Object>;否則,正如你所觀察到的,你不能把任何東西放進去。 Object將允許您放入任何東西,因爲任何東西都是Object的實例,而?不允許您將除null之外的任何東西放入其中,因爲它必須是未知類型的實例。

然後您應該創建它new LinkedHashMap<Class<?>, Object>

3

Class<?>Class<T>不同,因爲它用作類型參數,所以它必須是完全相同的類型。由於您的靜態變量的類型爲Class<?>,因此您無法通過嘗試分配更具體的內容來獲取任何內容。只需使用

Class<?> clazz = Class.forName(prop.getValue)); 

並將其放入地圖。無論如何,泛型對你的情況無能爲力,因爲T類型在運行時被擦除。

+0

非常感謝 – 2012-08-23 17:20:29