静态函数调用前的泛型尖括号

时间:2017-08-08 18:34:34

标签: java generics static guava

我一直使用泛型,并且总是看到使用的尖括号:Class<Type>(例如List<String>)。

今天我在调用静态方法之前遇到了泛型规范,例如:Class.<TypeA, TypeB>staticCall()。真实的例子是:ImmutableMap.<String, String>builder()

我从未见过这种用法,我在documentation中找不到这种具体用法。有人可以解释一下发生了什么吗?

3 个答案:

答案 0 :(得分:1)

这些被称为Generic Methods

在Java 7之前,您必须指定通用引用的类型:

Util.<Integer, String>compare(p1, p2);

现在编译器从上下文中推断出类型。

答案 1 :(得分:0)

我们也可以在类级别定义泛型。

ImmutableMap.Builder意味着Builder在这里是内部静态类。

和Builder方法将K和V作为参数意味着

意味着提供put(String,String)它提供像put(K,V)这样的方法,这样任何类型都可以使用put添加,如果你需要使用相同的类型。

例如,如果你通过传递字符串调用Builder.Put,那么在get中我们可以直接分配给String

String val = Bullder.get(K);

这意味着ImmutableMap.Builder的所有方法都适用于任何类类型。

这是泛型的力量,意味着不需要为不同类型重叠方法。  只需定义如下:

public Builder<K, V> put(K key, V value) {
  ensureCapacity(size + 1);
  ImmutableMapEntry<K, V> entry = entryOf(key, value);
  // don't inline this: we want to fail atomically if key or value is null
  entries[size++] = entry;
  return this;
}

答案 2 :(得分:-1)

它表示多种类型。列表只采用一种通用类型,这就是你看到的原因

List<String>

来自Map

的java文档

在顶部你会看到: 界面图

因此需要两个generic types。在你的不可变映射的例子中,它说K(ey)是一个字符串而V(alue)也是一个字符串。

在您提供的链接中,它提到这可以在部分

下进行
  

Box类的通用版本