有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java是否根据结果假定类型?

Java中有一个代码:

import java.util.HashMap;
import java.util.Collection;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    Map<Integer, String> langMap = new HashMap<>();
    langMap.put(1, "Java");
    langMap.put(2, "C#");
    Collection<String> values = langMap.values();
  }
}

最后一行代码中有Collection<String>。因为类型是基于从langMap分配的值而假定的,所以<String>不是没有必要吗


共 (3) 个答案

  1. # 1 楼答案

    HashMap的values()方法返回Collection<V>

    V是一个泛型,它将被推断为您声明的HashMap的值的类型

    var关键字

    在Java 10及更高版本中,可以使用var语法编写:

    var values = langMap.values();

    …并且Collection的类型将被隐式推断。这里它将被推断为Collection<String>,因为您将Map声明为Map<Integer, **String**>

    看这个code run live at IdeOne.com

    另见JEP 286: Local-Variable Type Inference

  2. # 2 楼答案

    说它没有必要是不对的,因为根据您的代码,您正试图从映射中获取值集(集合)。因此,定义此集合的数据类型(即集合将存储的信息的数据类型)将防止任何进一步的错误,并使其成为一个干净的集合。否则,它可能会显示格式异常。 例如,当您想存储一个名为“Map”的Map值,其中包含整数数据类型的值时,可以使用这个例子

    //获取地图的所有值

    集合值=映射。价值观()

    //这会将您的值集合转换为任何进一步的集合 //就像我在这里做的ArrayList一样

    ArrayList listOfValues=新的ArrayList(值)

    ******这行代码取自我的GitHub repo链接,如下所示 第26行,第27行。 https://github.com/gulab786-SRG/Gfg_Solution/blob/master/gfg/Maximum%20_Width_of_Tree.java

  3. # 3 楼答案

    Isn't <String> unnecessary

    不,这是必要的:没有<String>,变量的类型将是Collection,这是一种原始类型Don't use raw types

    我想Java可以为Collection<>这样的上下文提供一个符号,类似于diamond notation,但它没有

    你要么在支持它的语言版本中使用Collection<String>,要么在支持它的语言版本中使用var(11及更高版本)