带有静态泛型方法的java静态通用hashmap

时间:2012-08-01 12:49:38

标签: java generics

我有类似的东西:

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方法?

2 个答案:

答案 0 :(得分:3)

Class<?>Class<T>的类型不同,因为它用作类型参数,所以它必须完全相同。由于静态变量的类型为Class<?>,因此尝试分配更具体的内容时,您无法获得任何结果。只需使用

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

并将其放入地图中。无论如何,泛型对你的情况无能为力,因为类型T在运行时被删除。

答案 1 :(得分:1)

configFiles应为LinkedHashMap<Class<?>, Object>类型;否则,正如你所观察到的,你不能把任何东西放进去。 Object允许您将任何内容放入其中,因为任何内容都是Object的实例,而?不允许您将除null之外的任何内容放入其中,因为它必须是未知类型的实例。

然后您应该使用new LinkedHashMap<Class<?>, Object>

创建它