java - 如何推理这些 Java 泛型语法的返回类型?

标签 java generics

我在 Java 中遇到过这种语法

ImmutableMap.Builder<String, Object> builder = ImmutableMap.<String, Object>builder()

在左侧,我可以理解构建器采用字符串和对象两种类型。但右手语法让我感到困惑。 当我读到它时

  1. ImmutableMap.XXX//XXX 应该是属性或静态方法。
  2. 嗯,我发现Immutable.<String, Object>//为什么 XXX 现在是 <String, Object> ,泛型类型?
  3. 下一步,Immutable.<String, Object>builder();//现在,这是 builder() 返回类型吗?它会返回Immutable.<String, Object> 。构建器现在的行为如何像一个独立函数。

你可以看到我对 Java 中的这种语法有点困惑。我如何最好地理解这些语法?

一个更简单的例子是,在单元测试中,我必须这样做。

expect(mockDao.findId(role, name)).andReturn(Optional.<Long>absent());

absent()是Optinal的通用静态方法,如果它是Optional.absent()我会理解,但使它Optional.<Long>absent()而不是Optional<Long> Optional.absent()让我有点困惑。

我应该研究哪些来源来澄清我对这个概念的理解?

最佳答案

大多数时候,当方法是通用的时,例如:

public static <T> Optional<T> absent()

编译器可以自动从上下文中推断正确的泛型类型。例如:

Optional<String> opt = Optional.absent();

调用Optional的泛型静态方法absent(),编译器根据变量opt的类型推断出该方法的泛型类型(String)结果已分配。

但有时,它无法推断它,或者推断出您想要的类型之外的另一种类型,例如

Set<Object> set = Collections.singleton("foo");

要指定要使用哪种泛型类型来调用方法,语法是在方法名称之前指定泛型类型:

Set<Object> set = Collections.<Object>singleton("foo");

关于java - 如何推理这些 Java 泛型语法的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26616796/

相关文章:

java - 使用 Kryo(自定义序列化程序)序列化对象

c# - 将嵌套键值对分组到字典中

带有泛型的 java.util.Map 实现

java - Java 中类型删除后具有相同签名的静态方法

java - 表格行之间的间隙太大

java - Jsoup 没有找到我的元素

java - 使用layout_width ="wrap_content"获取TextView的可用宽度

java - Java中用管道分隔的多个值

c# - C# 中泛型类型的缺点

java - Apache Avro 框架可以在序列化期间处理参数化类型吗?