Eclipse是否有理由在以下声明中报告类型安全警告?
Map<String,List<Map<String, ParseNode>>> mapX = new HashMap();
我理解所有mapX
用法都是强类型的,但是java泛型公司坚持提供HashMap参数化类型(除了向代码添加噪声之外)可以实现什么?
答案 0 :(得分:5)
您的声明无效。
使用Java 5到6,你应该写:
Map<String, List<Map<String, ParseNode>>> m =
new HashMap<String, List<Map<String, ParseNode>>>();
从Java 7开始,您可以使用以下方法简化:
Map<String, List<Map<String, ParseNode>>> m = new HashMap<>();
您的语法意味着不同的东西并使用原始类型:
Map<String, List<Map<String, ParseNode>>> m = new HashMap();
<强>更新强>
要回答您的问题,这会产生影响(如Java Tutorial所述):
请注意,在通用期间利用自动类型推断 类实例化时,必须指定菱形。 [在你的情况下] 编译器生成未经检查的转换警告 因为HashMap()构造函数引用的是HashMap原型,而不是 [参数化地图]类型。
基本上意味着你的类型参数化在这里没有多大意义。 此声明后面的代码将被编译,并假设它包含声明类型的值。但是,在运行时,您声明了一种原始类型,并且您很可能已为此条目分配了包含不同值的映射。
你所写的内容相当于写下:
Map rawMap = new HashMap();
rawMap.add("string", "not list!");
Map<String, List<Map<String, ParseNode>>> m = rawMap; // uh oh!!
当你尝试以m
的{{1}}之一访问List<Map<String, ParseNode>>
之一值时,哪个会正常编译并在运行时爆炸。
这样做的原因是Generics的引入同时保留了源级的完全向后兼容性,因此有一些限制,例如:
<>
),答案 1 :(得分:0)
以下代码与您的相似:
List strs = new ArrayList();
strs.add("foo");
List<Integer> ints = strs;
我认为很明显这不是类型安全的。
答案 2 :(得分:-1)
Java 7不再需要它了,但Java 5&amp; 6做。我猜您已将项目编译器合规性级别设置为1.5或1.6。