泛型方法的完整调用类型是(如Generic Methods所说):
// use Collections#emptyList as an example
List<String> a = Collections.<String>emptyList();
可以简化为:
// use Collections#emptyList as an example
List<String> a = Collections.emptyList();
还有一个例子:
List<String> a = ...;
String s = a.<String>get(0);
字母类型参数也可以简化为:
String s = a.get(0);
这叫Type Inference。
查看 Guava ImmutableMap 的几个示例:
// type parameter can be omitted
ImmutableMap<String, Integer> map = ImmutableMap.<String, Integer>of("a", 1);
可以简化为:
ImmutableMap<String, Integer> map = ImmutableMap.of("a", 1);
这是由目标类型推断的。
但是对于这个:
// type parameter can not be omitted
ImmutableMap<String, Integer> map = ImmutableMap.<String, Integer>builder().build();
这令人困惑。事实上,完整的格式是:
// the latter type parameter can be omitted
ImmutableMap<String, Integer> map = ImmutableMap.<String, Integer>builder().<String, Integer>build();
有两个连续的泛型方法:builder & build。对于后一种方法,由于目标类型推断,可以省略类型参数。对于前一种方法,情况并非如此。它没有可以推断的目标类型,所以类型参数必须写在这里:
ImmutableMap<String, Integer> map = ImmutableMap.<String, Integer>builder()...
如果你真的想省略 builder 和 build 的类型参数,它们必须都有目标类型来推断:
ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
ImmutableMap<String, Integer> immutableMap = builder.build();