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>
不是没有必要吗
# 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 楼答案
说它没有必要是不对的,因为根据您的代码,您正试图从映射中获取值集(集合)。因此,定义此集合的数据类型(即集合将存储的信息的数据类型)将防止任何进一步的错误,并使其成为一个干净的集合。否则,它可能会显示格式异常。 例如,当您想存储一个名为“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 楼答案
不,这是必要的:没有
<String>
,变量的类型将是Collection
,这是一种原始类型Don't use raw types我想Java可以为
Collection<>
这样的上下文提供一个符号,类似于diamond notation,但它没有你要么在支持它的语言版本中使用
Collection<String>
,要么在支持它的语言版本中使用var
(11及更高版本)