泛型类型参数有限,没有传递实数类型

时间:2015-01-08 10:13:21

标签: java generics

我遇到过这段代码:

 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();

3 个答案:

答案 0 :(得分:7)

这称为type inference。这是

  

Java编译器能够查看每个方法调用和相应的声明,以确定使调用适用的类型参数(或参数)。推理算法确定参数的类型,如果可用,还确定分配或返回结果的类型。最后,推理算法试图找到适用于所有参数的最具体类型。

另见:

答案 1 :(得分:6)

那是因为的正确类型。

将对象的泛型视为对象类型的一部分是一个常见的错误。它不是。实际上,一旦编译完成,泛型就会被完全删除。这称为type erasure

Map<String,String>实际上只是Map<String,String>部分仅供编译器使用,以确保您在代码中正确使用它。

答案 2 :(得分:2)

Java不存储泛型信息。因此,当编译器完成代码后,映射将等同于HashMap<Object, Object>()。泛型只允许编译器验证您没有将错误的类型传递给函数,并自动(并安全地)转换从中检索的对象。

因此,无论您创建何种类型,它始终存储Object s。

因为你的方法(newHashMap())对地图没有任何作用(比如试图添加一个元素。这个函数适用于你选择的任何通用参数。调用方确实知道使用的泛型类型,所以它可以验证您不会尝试在其中存储错误类型的对象。