当使用 var 和不带参数的泛型方法时,Java 如何推断类型?

eja*_*eja 5 java generics var

考虑以下不带任何参数的泛型方法的示例:

private <T> Set<T> create() {
    return new HashSet<T>();
}
Run Code Online (Sandbox Code Playgroud)

根据文档,类型将根据返回值的使用方式(即在赋值期间)从定义的 LHS 类型推断,例如:

Set<Integer> numbers = create();
Run Code Online (Sandbox Code Playgroud)

使用关键字时效果如何var

将编译以下内容:

var numbers = create();
Run Code Online (Sandbox Code Playgroud)

Tho*_*ger 3

有关局部变量类型推断的常见问题解答描述了发生的情况:

\n
\n

Q8. 您可以使用右侧带有菱形的 var 吗?

\n

是的,它可以工作,但它\xe2\x80\x99可能不是你想要的。考虑:

\n
var list = new ArrayList<>();\n
Run Code Online (Sandbox Code Playgroud)\n

这将推断列表的类型为ArrayList<Object>。一般来说,最好在左侧使用显式类型,在右侧使用菱形,或者在左侧使用 var,在右侧使用显式类型。有关详细信息,请参阅LVTI 风格指南指南 G6

\n
\n

该指南 G6 还指出:

\n
\n

为了进行推理,diamond 可以使用目标类型(通常是声明的左侧)或构造函数参数的类型。如果两者都不存在,则它会退回到最广泛的适用类型,通常是Object。这通常不是我们想要的。

\n
\n