泛型类型参数有界,不传递真实类型
Generics type parameters getting bounded, without passing real type
我遇到过这段代码:
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();
那是因为它是的正确类型。
将对象的泛型视为对象类型的一部分是一个常见的错误。它不是。事实上,一旦编译完成,泛型就会被完全删除。这叫做type erasure.
一个Map<String,String>
其实就是一个Map
。 <String,String>
部分仅供编译器使用,以确保您在代码中正确使用它。
Java 不存储泛型信息。因此,当编译器完成您的代码时,映射将等同于 HashMap<Object, Object>()
。泛型只允许编译器验证您没有将错误的类型传递给函数,并自动(安全地)转换您从中检索的对象。
所以不管你创建什么类型,它总是存储 Object
s。
因为您的方法 (newHashMap()
) 不对地图执行任何操作(例如尝试添加元素。此函数适用于您选择的任何通用参数。调用方确实知道所使用的通用类型, 因此它可以验证您没有尝试在其中存储错误类型的对象。
这叫做type inference。这是
Java compiler's ability to look at each method invocation and corresponding declaration to determine the type argument (or arguments) that make the invocation applicable. The inference algorithm determines the types of the arguments and, if available, the type that the result is being assigned, or returned. Finally, the inference algorithm tries to find the most specific type that works with all of the arguments.
另请参阅:
我遇到过这段代码:
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();
那是因为它是的正确类型。
将对象的泛型视为对象类型的一部分是一个常见的错误。它不是。事实上,一旦编译完成,泛型就会被完全删除。这叫做type erasure.
一个Map<String,String>
其实就是一个Map
。 <String,String>
部分仅供编译器使用,以确保您在代码中正确使用它。
Java 不存储泛型信息。因此,当编译器完成您的代码时,映射将等同于 HashMap<Object, Object>()
。泛型只允许编译器验证您没有将错误的类型传递给函数,并自动(安全地)转换您从中检索的对象。
所以不管你创建什么类型,它总是存储 Object
s。
因为您的方法 (newHashMap()
) 不对地图执行任何操作(例如尝试添加元素。此函数适用于您选择的任何通用参数。调用方确实知道所使用的通用类型, 因此它可以验证您没有尝试在其中存储错误类型的对象。
这叫做type inference。这是
Java compiler's ability to look at each method invocation and corresponding declaration to determine the type argument (or arguments) that make the invocation applicable. The inference algorithm determines the types of the arguments and, if available, the type that the result is being assigned, or returned. Finally, the inference algorithm tries to find the most specific type that works with all of the arguments.
另请参阅: