在阅读完这个问题之后,我开始考虑Java 8中的泛型方法.具体来说,当链接方法时,泛型类型参数会发生什么.
对于这个问题,我将使用Guava的一些通用方法ImmutableMap,但我的问题更为通用,可以应用于所有链式泛型方法.
考虑ImmutableMap.of具有此签名的泛型方法:
public static <K, V> ImmutableMap<K, V> of(K k1, V v1)
Run Code Online (Sandbox Code Playgroud)
如果我们使用这个泛型方法声明a Map,编译器会正确推断泛型类型:
Map<String, String> map = ImmutableMap.of("a", "b");
Run Code Online (Sandbox Code Playgroud)
我知道从Java 8开始,编译器推理机制已得到改进,即它从上下文中推断出通用类型的方法,在本例中是一个赋值.
上下文也可以是方法调用:
void someMethod(Map<String, String> map) {
// do something with map
}
someMethod(ImmutableMap.of("a", "b"));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,泛型类型ImmutableMap.of是从参数的泛型类型推断出来的someMethod,即.Map<String, String> map.
但是当我尝试使用ImmutableMap.builder()和链接方法来构建我的地图时,我得到一个编译错误:
Map<String, String> map = ImmutableMap.builder()
.put("a", "b")
.build(); // error here: does not compile
Run Code Online (Sandbox Code Playgroud)
错误是:
Error:(...) java: incompatible types:
ImmutableMap<Object, Object> …Run Code Online (Sandbox Code Playgroud)