Java 将var与文本一起使用会产生一个原语类还是一个原语包装类?

Java 将var与文本一起使用会产生一个原语类还是一个原语包装类?,java,type-inference,local-variables,java-10,Java,Type Inference,Local Variables,Java 10,在阅读和讨论Java 10s新的保留类型名称后var (),讨论中出现了一个问题 将其与文本一起使用时,如: var number = 42; number现在是int还是Integer?如果您只是将其与比较运算符一起使用,或者将其用作参数,则由于自动装箱和-取消装箱,这通常并不重要。 但是由于Integers成员函数,它可能很重要 因此,哪个类型是由var创建的,一个原语int或类Integer?var要求编译器从初始值设定项的类型推断变量的类型,42的自然类型是int。因此,number将

在阅读和讨论Java 10s新的保留类型名称后
var
(),讨论中出现了一个问题

将其与文本一起使用时,如:

var number = 42;
number
现在是
int
还是
Integer
?如果您只是将其与比较运算符一起使用,或者将其用作参数,则由于自动装箱和-取消装箱,这通常并不重要。 但是由于
Integer
s成员函数,它可能很重要


因此,哪个类型是由
var
创建的,一个原语
int
或类
Integer

var
要求编译器从初始值设定项的类型推断变量的类型,
42
的自然类型是
int
。因此,
number
将是一个
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

注意:要在家中试用,请根据14.4.1局部变量声明符和类型中的说明,使用之外的值:

如果LocalVariableType是
var
,那么当将T视为没有出现在赋值上下文中的初始值设定项表达式的类型时,它就是一个独立的表达式()。局部变量的类型是T相对于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"

拥有一个通用的
var
类型IMO的唯一“好处”是能够为它分配动态属性,比如C#和JS。像
vara={};a、 任意属性=“嘿!”-然而,这似乎是不可能的(尽管我可能错了)。@BackSlash你可以这样做
var x=new Object(){int y;int z;};int检验=x.y
这仅适用于编译器推断的类型,另请参见@backslax:您所说的是动态类型。这个问题是关于隐式类型的。这是两件完全不同的事情。@Eugene你不正确地使用了术语“语法糖”。这不是一个纯粹的语法转换
获取的keystokes多于
整数x=10var i=10
后跟
i instanceof Integer
。您将得到
错误:意外类型
,因为它是int而不是引用。仅供参考,您不需要
System.out.println
。只需自行计算
infered1==infered2
。Michael,是的,我想了一下instanceof,但没有尝试。我应该:)一般来说,我喜欢代码的“证明”,但对于更一般的答案,JLS更好。可以更改实现,除非在JLS中写入。但由于我从未想过何时使用
Jshell
,我喜欢这个答案@阿克塞尔同意。如果答案是基于经验主义的,我会说你应该总是说明你测试的是什么版本。然而,一种方法是一定要尝试一下,你可以尝试看看
number instanceof Integer
对你的情况不起作用(因为
instanceof
对原始类型不起作用)。而另一方面,如果该数字被转换为
(整数)42
public void method(Integer i) {
    System.out.print("Integer method");
}

var n = 42; // a has type 'int'
method(n); // => "Integer method"