我遇到过这段代码:
public static <K,V> HashMap<K,V> newHashMap() {
return new HashMap<K,V>();
}
我们可以使用它来创建HashMap
的实例,如下所示:
Map<String, List<String>> anagrams = newHashMap();
现在的问题是调用方法newHashMap
而不传递所需类型(在本例中为String, List<String>
),但java仍在创建正确的类型。如何?
我在这里很困惑,K,V
如何被限制在代码左侧提到的类型:
Map<String, List<String>>
甚至没有传递:
newHashMap();
答案 0 :(得分:7)
这称为type inference。这是
Java编译器能够查看每个方法调用和相应的声明,以确定使调用适用的类型参数(或参数)。推理算法确定参数的类型,如果可用,还确定分配或返回结果的类型。最后,推理算法试图找到适用于所有参数的最具体类型。
另见:
答案 1 :(得分:6)
那是因为是的正确类型。
将对象的泛型视为对象类型的一部分是一个常见的错误。它不是。实际上,一旦编译完成,泛型就会被完全删除。这称为type erasure。
Map<String,String>
实际上只是Map
。 <String,String>
部分仅供编译器使用,以确保您在代码中正确使用它。
答案 2 :(得分:2)
Java不存储泛型信息。因此,当编译器完成代码后,映射将等同于HashMap<Object, Object>()
。泛型只允许编译器验证您没有将错误的类型传递给函数,并自动(并安全地)转换从中检索的对象。
因此,无论您创建何种类型,它始终存储Object
s。
因为你的方法(newHashMap()
)对地图没有任何作用(比如试图添加一个元素。这个函数适用于你选择的任何通用参数。调用方确实知道使用的泛型类型,所以它可以验证您不会尝试在其中存储错误类型的对象。