我发现了一些通用代码,它让我难以理解它是如何工作的.我不明白它在哪里获得用于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)
类型推断是根据调用点进行的。
但是,类型推断仅适用于将返回值分配给变量的返回类型。这是规范中写的
如果方法结果出现在将进行赋值转换的上下文中,则 [...]
否则,任何未解析的类型参数始终会变为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()