申报RHS的仿制药

时间:2012-03-02 22:42:45

标签: java generics

Eclipse是否有理由在以下声明中报告类型安全警告?

Map<String,List<Map<String, ParseNode>>> mapX = new HashMap();

我理解所有mapX用法都是强类型的,但是java泛型公司坚持提供HashMap参数化类型(除了向代码添加噪声之外)可以实现什么?

3 个答案:

答案 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的引入同时保留了源级的完全向后兼容性,因此有一些限制,例如:

  • 没有至少一些支持仿制药的指标(这里就是所谓的钻石操作员 <>),
  • 是不可能的。
  • 无法在运行时检查泛型类型,因为它们必须使用 Type Erasure 来实现。

进一步阅读

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