这个Java函数从哪里推断出它的泛型类型?

Dea*_*ron 6 java generics

我发现了一些通用代码,它让我难以理解它是如何工作的.我不明白它在哪里获得用于T的泛型类型.这是一个过于简单的示例,但我仍然不明白这是如何有效的Java代码.

public static void main(String[] args) {
  System.out.print(get());
}

public static <T> T get()
{
  return (T) getObj();
}

public static Object getObj() 
{
  return Boolean.FALSE;
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 3

类型推断是根据调用点进行的。

但是,类型推断仅适用于将返回值分配给变量的返回类型。这是规范中写的

如果方法结果出现在将进行赋值转换的上下文中,则 [...]

否则,任何未解析的类型参数始终会变为Object.
在您的示例中,这会起作用,因为存在print(Object)过载。

另一方面,看看这段代码:

print(get());

public void print(Boolean x) { }

public <T> T get() {
    return (T) Boolean.FALSE;
}
Run Code Online (Sandbox Code Playgroud)

这将产生编译错误,因为编译器在查看 之前推断get()为返回。Objectprint()