Ela*_*nda 12 java generics syntax guava
我今天看到这个代码:
ImmutableMap<Class<? extends ClientCommand>, CommandProcessorInterface> immutableMap =
ImmutableMap.<Class<? extends ClientCommand>, CommandProcessorInterface>of(...
Run Code Online (Sandbox Code Playgroud)
这个语法是什么意思?
ImmutableMap.<Class ..
我知道仿制药就在课堂名称之后.没有?
有什么区别:
ImmutableMap<Class..
和 ImmutableMap.<Class..
Kon*_*kov 21
这意味着你调用一个通用的静态方法,被称为of
在ImmutableMap
类.
它与你调用一个static
嵌套在某个类中的方法几乎相同:
SomeClass.staticMethod();
Run Code Online (Sandbox Code Playgroud)
对于您的方法定义了类型参数的情况,您可以显式提供泛型类型,这样做:
SomeClass.<Type>genericStaticMethod();
Run Code Online (Sandbox Code Playgroud)
并回答你最后的问题:
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.
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这似乎并不是真正需要的,但是由于Java 8中的泛型类型推断变得更加强大,因此我处于困境。
泛型方法是使用任何泛型类型参数声明的方法。请参阅此处的文档。方法的泛型类型不必与声明类的任何泛型类型参数相关。该类可能是也可能不是泛型。
在调用泛型方法(静态或非静态)时,您可以指定泛型类型,但通常不会看到它,因为它通常是自动检测到的。您找到的语法就是指定它的语法。
如果有这样声明的方法:
<T> void fromArrayToCollection(T[] a, Collection<T> c) { ...
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
Integer[] a = ...
ArrayList<Integer> l = ...
x.fromArrayToCollection(a, l);
Run Code Online (Sandbox Code Playgroud)
但如果你有这样的一个:
<T> Collection<T> myMethod(int c) {
return new ArrayList<T>(c);
}
Run Code Online (Sandbox Code Playgroud)
然后您有两种方法可以向编译器阐明类型。您可以通过两种方式为其提供足够的信息。
一种是在调用中指定类型:
Object c = x.<Integer>myMethod(5);
Run Code Online (Sandbox Code Playgroud)
另一种是类型转换(通过分配给变量显式或隐式):
Collection<Integer> c = x.myMethod(5);
Run Code Online (Sandbox Code Playgroud)