将 var 与文本一起使用是否会导致基元或基元包装类?

在阅读并讨论了Java 10s新的保留类型名称varJEP 286:局部变量类型推断)之后,讨论中出现了一个问题。

当它与文本一起使用时,例如:

var number = 42;

现在是 一个 或 一个 ?如果您只是将其与比较运算符一起使用或作为参数,则由于自动装箱和-unboxing,它通常无关紧要。但是由于s成员功能,它可能很重要numberintIntegerInteger

那么哪种类型是由 ,一个基元或类创建的呢?varintInteger


答案 1

var要求编译器从初始值设定项的类型推断变量的类型,自然类型为 。所以将是一个.这就是JLS示例所说的42intnumberint

var a = 1;  // a has type 'int' 

如果它以任何其他方式工作,我会感到惊讶,当我写这样的东西时,我绝对期望一个原始的。

如果你需要一个 as boxed 基元,你可以这样做:var

var x = (Integer) 10;  // x is now an Integer

答案 2

根据 14.4.1 局部变量声明符和类型提出的规范更改

如果 LocalVariableType 是 ,则设 T 是初始值设定项表达式的类型,当被视为它没有出现在赋值上下文中时,因此是一个独立的表达式 (15.2)。局部变量的类型是 T 相对于 T 提到的所有合成类型变量的向上投影 (4.10.5)。var

换句话说,局部变量的推断类型是初始值设定项表达式在用作独立表达式时将具有的类型。 由于独立表达式具有类型,因此,变量的类型为 。42intnumberint

向上投影是规范更改中定义的一个术语,不适用于此类简单情况。


推荐