(在研究这个时,我发现所有的帖子和网站都说你不能简单地转换为通用类型,因为类型擦除,我没有发现任何问题。)
有人可以向我解释为什么Eclipse会提示我这个警告吗?
public <T> T getFromBag(String key, Class<T> clazz) {
Object val = null;
T typeCastValue = null;
if (commonDataBag.containsKey(key)) {
val = commonDataBag.get(key);
typeCastValue = clazz.cast(val);
}
return typeCastValue;
}
用法:
Map<String, Foo> stuff= myService().<Map>getFromBag(key, Map.class);
警告:
Type safety: The expression of type Map needs unchecked conversion to conform to Map<String,Foo>
答案 0 :(得分:2)
有人可以向我解释为什么Eclipse会提示我这个警告吗?
在myService().<Map>getFromBag(key, Map.class)
中,您为类型变量<Map>
提供了显式类型见证(T
)。因此,呼叫的返回类型为T
,即Map
。然后将(类型Map
)分配给类型Map<String, Foo>
,这是从原始类型到参数化类型的未经检查的隐式转换。
答案 1 :(得分:0)
您的返回值是HashMap类,无法确定它是HashMap,因此您会收到警告。
答案 2 :(得分:0)
想象一下,如果你有这样的代码:
Map<String, String> map = new HashMap<>();
map.put("foo", "bar");
commonDataBag.put("42", map);
然后你打电话:
Map<String, Foo> stuff= myService().<Map>getFromBag("42", Map.class);
Foo foo = stuff.get("foo");
此时您将获得classcastexception,因为您的地图不包含Foo
值,其中包含String
个值。
这是提示警告的原因。