gpt4 book ai didi

java - 声明 RHS 上的泛型

转载 作者:行者123 更新时间:2023-11-29 03:49:10 26 4
gpt4 key购买 nike

Eclipse在下面的声明中报类型安全警告是有原因的吗?

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

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

最佳答案

您的声明无效。

使用泛型(参数化类型)

使用 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 所述):

Note that to take advantage of automatic type inference during generic class instantiation, you must specify the diamond. [In your case] the compiler generates an unchecked conversion warning because the HashMap() constructor refers to the HashMap raw type, not the [parameterized Map] type.

基本上就是说你这里的类型的参数化没有太大意义。此声明之后的代码将在假设它包含具有声明类型的值的情况下进行编译。但是在运行时,您声明了一个原始类型的类型,并且您很可能已经为该条目分配了一个包含不同值的映射。

你写的相当于写这样的东西:

Map rawMap = new HashMap();
rawMap.add("string", "not list!");

Map<String, List<Map<String, ParseNode>>> m = rawMap; // uh oh!!

这会很好地编译,但当您尝试访问 m 之一时,它会在运行时炸毁您的脸。的值为 List<Map<String, ParseNode>> .

原因

这样做的原因是引入泛型的同时在源代码级别保留了完全的向后兼容性,因此它们存在一些局限性,例如:

  • 如果没有至少一些泛型支持指标(这里是所谓的钻石运算符 <>),就不可能有简写形式,
  • 无法在运行时检查泛型类型,因为它们必须用 Type Erasure 实现.

延伸阅读

关于java - 声明 RHS 上的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com