【问题标题】:Map.Entry without type declaration [duplicate]没有类型声明的 Map.Entry [重复]
【发布时间】:2020-02-16 11:19:34
【问题描述】:

我是 Java 新手,但我需要快速掌握一些基础知识才能使用一些基本的数据结构。

这是一个我想更好理解的小例子,即Map.Entry<Integer,String> 部分。

HashMap<Integer,String> my_hashmap = new HashMap<>();

 my_hashmap.put(20,"twenty");
 my_hashmap.put(30,"thirty");

 for (Map.Entry<Integer,String> m:my_hashmap.entrySet()) {
     System.out.println(m.getKey() + " " + m.getValue());
 }

事实证明,我可以省略 &lt;Integer, String&gt; 声明,它根本没有区别。这是一个坏习惯吗?据我了解,在幕后,这在某种程度上被解释为 Object 类型,所以没有问题,但这并不能从使用泛型中受益。我的理解正确吗?谢谢。

【问题讨论】:

  • 使用两个临时变量存储key&value,可以进一步看出区别。
  • 一个 -Xlint:all 到你的编译。这是一种原始类型。 m.getKey()m.getValue() 将返回 Object

标签: java generics hashmap raw-types


【解决方案1】:

使用原始类型是不好的做法。

在您的示例中,由于您只是打印每个条目的键和值,因此代码通过编译并工作,因为它使用所有类实现的toString() 方法来打印它们。

另一方面,如果您想打印值 Stringlength() 而不是实际的 String,您可以编写

System.out.println(m.getKey() + " " + m.getValue().getLength());

现在,如果你改变了,这将不会通过编译

for (Map.Entry<Integer,String> m:my_hashmap.entrySet())

for (Map.Entry m:my_hashmap.entrySet())

因为Object 没有length() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多