繁体   English   中英

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

[英]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..

这意味着你调用一个通用的静态方法,叫ofImmutableMap类。

它与嵌套在某些类中的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()...

如果您真的想省略builderbuild的类型参数,则它们都必须具有用于推断的目标类型:

ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
ImmutableMap<String, Integer> immutableMap = builder.build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM