在转换为通用类型时键入安全警告

时间:2016-06-16 18:03:31

标签: java generics

在研究这个时,我发现所有的帖子和网站都说你不能简单地转换为通用类型,因为类型擦除,我没有发现任何问题。

有人可以向我解释为什么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>

3 个答案:

答案 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个值。

这是提示警告的原因。