2013-11-28 79 views
1

如何阻止编译器抱怨map.get()?带类密钥的Java HashMap泛型

“类型不匹配:不能从的ClassInfo转换<捕获#1的>到的ClassInfo <牛逼>?”

class Context 
{ 
    final private Map<Class<?>,ClassInfo<?>> map = new HashMap<>(); 

    <T> ClassInfo<T> getClassInfo(Class<T> c) 
    { 
     ClassInfo<T> ci = map.get(c); 
     if (ci == null) { 
      ci = new ClassInfo<T>(c); 
      map.put(c, ci); 
     } 
     return(ci); 
    } 
} 

一些更多的信息:

的ClassInfo包含类数据,通过反射聚集。

只有在使用Eclipse编译器时,编译器错误才会发生在JDK javac中。

+0

你怎么看这条线怎么办? ' ClassInfo getClassInfo(Class c)' –

+0

您可以附上Context 并用T声明Map –

回答

1

我固定添加()浇铸到该代码的问题:

进口的java.util.HashMap; import java.util.Map;

class Context 
{ 
    private final Map<Class<?>,ClassInfo<?>> map = new HashMap<Class<?>,ClassInfo<?>>(); 

    <T> ClassInfo<T> getClassInfo(Class<T> c) 
    { 
     @SuppressWarnings("unchecked") 
     ClassInfo<T> ci = (ClassInfo<T>) map.get(c); 
     if (ci == null) { 
      ci = new ClassInfo<T>(c); 
      map.put(c, ci); 
     } 
     return(ci); 
    } 
} 

要知道,虽然,铸件通常是危险的,你应该只使用他们,如果你真的确定对象实际上是在你期待什么。

该解决方案的缺点是它会创建一个警告,我不得不压制。希望能帮助到你!

+0

实际上并不奏效。现在有一个编译器错误和一个编译器警告。错误信息如下:类型安全性:取消选中从...到...并且警告信息为:不必要的@SuppressWarnings(“未选中”)。这可能是我的eclipse编译器设置有点太受限制了。 – caprona

+0

我启用了Eclipse的以下编译器选项:“用'@SuppressWarnings'抑制可选错误”。现在代码没有错误或警告。但是当执行这个方法时,我得到一个错误异常“未解决的编译问题”。 – caprona

1

只投它与用途:

@SuppressWarnings("unchecked") 
ClassInfo<T> ci = (ClassInfo<T>) map.get(c); 

确保你是把T型成散列图其他明智的铸造例外可能发生。

也就是说,如果T代表字符串,然后map.get(C)应始终返回null或的ClassInfo

+0

编译器错误从“类型不匹配”更改为“类型安全性”...(请参阅第一个答案) – caprona

+0

这只是一个警告。要清除该警告,请检查我的更新答案 –