通用方法的完整调用类型是(如
通用方法所述):
// use Collections#emptyList as an example
List<String> a = Collections.<String>emptyList();
可以简化为:
// use Collections
List<String> a = Collections.emptyList()
另一个例子:
List<String> a = ...;
String s = a.<String>get(0);
信件类型参数也可以简化为:
String s = a.get(0)
This is called
类型推断。
请查看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()...
如果您真的想要省略构建器和构建函数的类型参数,它们都必须具有用于推断的目标类型:
ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
ImmutableMap<String, Integer> immutableMap = builder.build();
of
的通用参数,而不是类本身的参数。 - Dmitry Ginzburg