[英]What does the dot operator `.` (before the generic parameter) mean?
我今天看到这段代码:
ImmutableMap<Class<? extends ClientCommand>, CommandProcessorInterface> immutableMap =
ImmutableMap.<Class<? extends ClientCommand>, CommandProcessorInterface>of(...
这个语法是什么意思?
ImmutableMap.<Class..
我知道泛型就在类名之后。 不?
有什么区别:
ImmutableMap<Class..
和ImmutableMap.<Class..
这意味着你调用一个通用的静态方法,叫of
在ImmutableMap
类。
它与嵌套在某些类中的static
方法几乎相同:
SomeClass.staticMethod();
对于您的方法定义了类型参数的情况,您可以显式提供泛型,并且可以这样进行:
SomeClass.<Type>genericStaticMethod();
并回答您最后的问题:
ImmutableMap<Class...>
和ImmutableMap.<Class...
什么区别?
第一个通常在创建泛型类的实例时使用。 它用于在类级别定义泛型类型,而第二个用于调用嵌套在某个类中的泛型静态方法。
它涉及一个静态方法ImmutableMap.of
。 这具有其自己的通用类型参数。
class Test {
static <T> T f() { return null; }
void t() {
String s = Test.f(); // Inferred from LHS.
String t = Test.<String>f(); // Not needed.
int n = Test.<String>f().length(); // Needed.
}
在您的情况下,这似乎并不是真正需要的,但是由于Java 8中的泛型类型推断变得更加强大,因此我处于困境。
泛型方法是使用任何泛型类型参数声明的方法。 在这里查看文档。 方法的泛型类型不必与声明类的任何泛型类型参数相关。 该类可能是泛型,也可能不是。
调用泛型方法(是否静态)时,您可以指定泛型类型,但通常不会看到它,因为通常会自动检测到它。 您找到的语法就是指定它的一种。
如果有这样声明的方法:
<T> void fromArrayToCollection(T[] a, Collection<T> c) { ...
您可以这样称呼它:
Integer[] a = ...
ArrayList<Integer> l = ...
x.fromArrayToCollection(a, l);
但是如果您有这样一个人:
<T> Collection<T> myMethod(int c) {
return new ArrayList<T>(c);
}
然后,您可以通过两种方法向编译器说明类型。 您可以通过两种方式为其提供足够的信息。
一种是在呼叫中指定类型:
Object c = x.<Integer>myMethod(5);
另一个与类型转换(通过分配给变量而显式或隐式):
Collection<Integer> c = x.myMethod(5);
通用方法的完整调用类型是(如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);
这称为类型推断。
请参阅 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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.