我在 Java 中遇到过这种语法
ImmutableMap.Builder<String, Object> builder = ImmutableMap.<String, Object>builder()
在左侧,我可以理解构建器采用字符串和对象两种类型。但右手语法让我感到困惑。 当我读到它时
- ImmutableMap.XXX//XXX 应该是属性或静态方法。
- 嗯,我发现
Immutable.<String, Object>
//为什么 XXX 现在是<String, Object>
,泛型类型? - 下一步,
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/