点运算符`.`(在通用参数之前)是什么意思?

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

这意味着你调用一个通用的静态方法,被称为ofImmutableMap类.

它与你调用一个static嵌套在某个类中的方法几乎相同:

SomeClass.staticMethod();
Run Code Online (Sandbox Code Playgroud)

对于您的方法定义了类型参数的情况,您可以显式提供泛型类型,这样做:

SomeClass.<Type>genericStaticMethod();
Run Code Online (Sandbox Code Playgroud)

并回答你最后的问题:

ImmutableMap<Class...>和之间有什么区别ImmutableMap.<Class...

第一个通常在创建泛型类的实例时使用.它用于在类级别定义泛型类型,而第二个用于调用嵌套在某个类中的泛型静态方法.

  • 您通常不需要提供它.请参阅[docs](https://docs.oracle.com/javase/tutorial/extra/generics/methods.html).`fromArrayToCollection(sa,cs); // T推断为String` (3认同)
  • @ user270349我甚至会说"你需要"这句话是完全错误的. (3认同)
  • 它可能是从返回类型转换(或赋值)推断出来的,但并不总是可行的.我只是说"_你需要提供泛型类型_"并不总是如此 (2认同)

Joo*_*gen 5

它涉及一种静态方法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中的泛型类型推断变得更加强大,因此我处于困境。


aal*_*lku 5

泛型方法是使用任何泛型类型参数声明的方法。请参阅此处的文档。方法的泛型类型不必与声明类的任何泛型类型参数相关。该类可能是也可能不是泛型。

在调用泛型方法(静态或非静态)时,您可以指定泛型类型,但通常不会看到它,因为它通常是自动检测到的。您找到的语法就是指定它的语法。

如果有这样声明的方法:

<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)