在Map中放入错误类型的对象

时间:2015-11-17 19:04:21

标签: java dictionary casting

考虑到这段代码,我有两张地图,Map<String, Integer>Map<String, String>。我将第二个分配给一个Object并将此对象转换为Map,以便我可以将所有这个地图放到第一个。

    Map<String, Integer> map = new HashMap<>();
    map.put("one", 1);
    Map<String, String> otherMap = new HashMap<>();
    otherMap.put("two", "two");

    Object obj = otherMap;

    map.putAll((Map<String,Integer>)obj);

    Assert.assertFalse(map.get("two") instanceof Integer);
    Assert.assertEquals("{one=1, two=two}", map.toString());

第一个断言确保我的Map的第二个元素不是Integer,那么putAll怎么没有失败呢? 第二个断言是jus,这表明这张地图没有明显的问题。 当地图首次分配给对象时,如何确保putAll方法失败?

由于

2 个答案:

答案 0 :(得分:2)

泛型是编译时功能,在运行时强制执行。您的代码将使用未经检查的警告进行编译,并告诉您:您的代码可能会出现意外行为。

为了大规模过度简化,所有Map在运行时都被视为Map<Object, Object>。 (不是真的,但有点像。)

答案 1 :(得分:0)

如果您真的想要,可以使用docs来包装地图并在运行时强制执行类型安全。但是有一个相关的性能成本。