在原语或原始包装类中使用带有文字结果的var吗?

swe*_*dev 32 java type-inference local-variables java-10

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

与文字一起使用时,如:

var number = 42;
Run Code Online (Sandbox Code Playgroud)

number现在的int还是一个Integer?如果您只是将它与比较运算符一起使用或作为参数使用它通常无关紧要,这要归功于自动装箱和开箱.但由于Integer成员职能,它可能很重要.

那么哪个类型是由原varint或类创建的Integer

Eug*_*ene 31

var要求编译器根据初始化程序的类型和42is 的自然类型推断变量的类型int.所以number将是一个int.这就是JLS示例所说的:

var a = 1;  // a has type 'int' 
Run Code Online (Sandbox Code Playgroud)

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

如果你需要一个var盒装原语,你可以这样做:

var x = (Integer) 10;  // x is now an Integer
Run Code Online (Sandbox Code Playgroud)

  • @BackSlash:你所说的是*动态打字*.这个问题是关于*隐式打字*.这是两件完全不同的事情. (13认同)
  • 好吧,`var x =(Integer)10;`比'整数x = 10需要更多的键盘;`所以我可能会留在后者. (5认同)
  • @BackSlash你可以这样做`var x = new Object(){int y; int z; }; int test = xy;`这只适用于编译器推断的类型,另请参阅/sf/ask/3458765761/ -推理 (2认同)
  • @Eugene你正在使用"syntactic sugar"这个词.这不是纯粹的语法转换. (2认同)

Jör*_*tag 10

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

如果LocalVariableTypevar,那么让T作为初始化表达式的类型,当它被视为没有出现在赋值上下文中时,因此是一个独立的表达式(15.2).局部变量的类型是T相对于T(4.10.5)提到的所有合成类型变量的向上投影.

换句话说,局部变量的推断类型是初始化表达式在用作独立表达式时将具有的类型.42作为一个独立的表达式有类型int,ergo,变量number是类型int.

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


dav*_* a. 7

我们来试试吧.使用jshell:

jshell> Integer boxed1 = 42000;
boxed1 ==> 42000

jshell> Integer boxed2 = 42000;
boxed2 ==> 42000

jshell> System.out.println(boxed1 == boxed2);
false

jshell> var infered1 = 42000;
infered1 ==> 42000

jshell> var infered2 = 42000;
infered2 ==> 42000

jshell> System.out.println(infered1 == infered2);
true
Run Code Online (Sandbox Code Playgroud)

在第一次比较中,两个变量不一样; 他们是不同的例子.然而,第二个比较是正确的,因此必须在这里引入一个int.

注意:要在家中尝试,请使用<-128,128之外的值.缓存该范围内的整数实例.

  • 这是一个非常迂回的证明.而且你依赖于Integer缓存的实现细节...更好的证据就是`var i = 10`,然后是`i instanceof Integer`.你会得到`ERROR:unexpected type`,因为它是一个int而不是一个引用. (14认同)
  • 而且仅供参考,你不需要`System.out.println`.只是自己评估`infered1 == infered2`. (4认同)