【问题标题】:Generics angle brackets before static function call [duplicate]静态函数调用之前的泛型尖括号[重复]
【发布时间】:2023-04-01 20:04:02
【问题描述】:

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

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

我从未见过这种用法,也无法在documentation 中找到这种特定用法。有人能解释一下是怎么回事吗?

【问题讨论】:

  • 这是一个通用的静态方法,在这里查看答案:stackoverflow.com/questions/27166610/…
  • 哦,是的,这就是我要找的东西!我没想过要搜索 .运算符而不是之后的泛型。也许对那些会以我同样方式搜索的人开放?

标签: java generics static guava


【解决方案1】:

那些被称为Generic Methods。

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

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

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

【讨论】:

  • 嗯,我在 Java 8 上,仍然需要指定通用引用。 :困惑:
  • 请阅读this。
【解决方案2】:

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

ImmutableMap.Builder 在这里表示 Builder 是内部静态类。

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

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

例如,如果您通过传递 string 来调用 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;
}

【讨论】:

    【解决方案3】:

    它表示多种类型。 List 仅采用一种通用类型,这就是您看到的原因

    List<String>
    

    来自Map 的 java 文档

    在顶部,您会看到: 界面图

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

    在您提供的链接中,它提到这在部分下是可能的,

    Box 类的通用版本

    【讨论】:

    • 也许我必须指定,我知道您可以指定 2 种类型。我不知道您可以在方法调用之前指定它。 :)
    • 我认为您正在键入要调用静态方法的类 - Immutable Map 类本身特定于类型化的键和值。你总是在调用静态方法之前引用类名,在这种情况下,类名只包括泛型类型实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多