将 var 与文字一起使用会导致原始包装器还是原始包装器 class?
Does using var with a literal result in a primitive or a primitive wrapper class?
看完再说 Java 10s new reserved type name var
(JEP 286: Local-Variable Type Inference),讨论中出现1个问题
当它与文字一起使用时:
var number = 42;
现在 number
是 int
还是 Integer
?如果您只是将它与比较运算符一起使用或用作参数,由于自动装箱和拆箱,通常并不重要。
但由于 Integer
的成员函数,它 可能很重要 。
那么var
创建的是原始类型int
还是classInteger
?
var
要求编译器根据初始化器的类型推断变量的类型,42
的自然类型是int
。所以 number
将是 int
。这就是 JLS example says:
var a = 1; // a has type 'int'
如果它以任何其他方式工作,我会感到惊讶,当我写这样的东西时,我绝对期待一个原始的。
如果您需要 var
作为盒装原语,您可以这样做:
var x = (Integer) 10; // x is now an Integer
让我们测试一下。使用 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
第一次比较,两个变量不一样;他们是不同的实例。然而,第二个比较是正确的,因此这里必须推断出一个 int。
注意:要在家尝试,请使用 <-128、128) 之外的值。该范围内的整数实例被缓存。
根据 14.4.1 中的 proposed specification changes 局部变量声明符和类型:
If LocalVariableType is var
, then let T be the type of the initializer expression when treated as if it did not appear in an assignment context, and were thus a standalone expression (15.2). The type of the local variable is the upward projection of T with respect to all synthetic type variables mentioned by T (4.10.5).
换句话说,局部变量的推断类型是初始化表达式作为独立表达式使用时的类型。 42
作为独立表达式的类型为 int
,因此,变量 number
的类型为 int
.
向上投影 是规范更改中定义的术语,不适用于像这样的简单情况。
编译器对待 var number = 42;
与 int number = 42;
类似
public void method(Integer i) {
System.out.print("Integer method");
}
public void method(int i) {
System.out.print("int method");
}
var n = 42; // n has type 'int'
method(n); // => "int method"
并在以下情况下自动装箱:
public void method(Integer i) {
System.out.print("Integer method");
}
var n = 42; // a has type 'int'
method(n); // => "Integer method"
看完再说 Java 10s new reserved type name var
(JEP 286: Local-Variable Type Inference),讨论中出现1个问题
当它与文字一起使用时:
var number = 42;
现在 number
是 int
还是 Integer
?如果您只是将它与比较运算符一起使用或用作参数,由于自动装箱和拆箱,通常并不重要。
但由于 Integer
的成员函数,它 可能很重要 。
那么var
创建的是原始类型int
还是classInteger
?
var
要求编译器根据初始化器的类型推断变量的类型,42
的自然类型是int
。所以 number
将是 int
。这就是 JLS example says:
var a = 1; // a has type 'int'
如果它以任何其他方式工作,我会感到惊讶,当我写这样的东西时,我绝对期待一个原始的。
如果您需要 var
作为盒装原语,您可以这样做:
var x = (Integer) 10; // x is now an Integer
让我们测试一下。使用 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
第一次比较,两个变量不一样;他们是不同的实例。然而,第二个比较是正确的,因此这里必须推断出一个 int。
注意:要在家尝试,请使用 <-128、128) 之外的值。该范围内的整数实例被缓存。
根据 14.4.1 中的 proposed specification changes 局部变量声明符和类型:
If LocalVariableType is
var
, then let T be the type of the initializer expression when treated as if it did not appear in an assignment context, and were thus a standalone expression (15.2). The type of the local variable is the upward projection of T with respect to all synthetic type variables mentioned by T (4.10.5).
换句话说,局部变量的推断类型是初始化表达式作为独立表达式使用时的类型。 42
作为独立表达式的类型为 int
,因此,变量 number
的类型为 int
.
向上投影 是规范更改中定义的术语,不适用于像这样的简单情况。
编译器对待 var number = 42;
与 int number = 42;
public void method(Integer i) {
System.out.print("Integer method");
}
public void method(int i) {
System.out.print("int method");
}
var n = 42; // n has type 'int'
method(n); // => "int method"
并在以下情况下自动装箱:
public void method(Integer i) {
System.out.print("Integer method");
}
var n = 42; // a has type 'int'
method(n); // => "Integer method"