阅读并讨论了Java 10的新保留类型名称var
(JEP 286:局部变量类型推断)后,讨论中出现了一个问题。
当与字面值一起使用时:
var number = 42;
现在的number
是一个int
还是一个Integer
?如果你只是将其与比较运算符一起使用或作为参数使用,由于自动装箱和拆箱,通常不太重要。
但由于Integer
的成员函数,这可能会有影响。
那么var
创建的是原始类型的int
还是类Integer
?
阅读并讨论了Java 10的新保留类型名称var
(JEP 286:局部变量类型推断)后,讨论中出现了一个问题。
当与字面值一起使用时:
var number = 42;
现在的number
是一个int
还是一个Integer
?如果你只是将其与比较运算符一起使用或作为参数使用,由于自动装箱和拆箱,通常不太重要。
但由于Integer
的成员函数,这可能会有影响。
那么var
创建的是原始类型的int
还是类Integer
?
var
会让编译器从变量的初始化器中推断出变量的类型,而 42
的自然类型是 int
。因此,number
将是一个 int
类型。这就是JLS示例中所说的内容:
var a = 1; // a has type 'int'
如果我写出这样的东西,而不期望原始数据类型,那我会感到惊讶。
如果你需要作为包装好的原始数据类型的 var
,你可以这样做:
var x = (Integer) 10; // x is now an Integer
int test = x.y;` 进行类似的操作。这只有在编译器推断类型的情况下才可能实现,还可参考此链接 https://dev59.com/4qnka4cB1Zd3GeqPW_00。
- Eugene让我们进行测试。使用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
var i = 10
,然后跟着使用i instanceof Integer
。你会得到ERROR: unexpected type
,因为它是一个int而不是引用。 - MichaelSystem.out.println
。只需单独评估 infered1 == infered2
即可。 - MichaelJshell
,所以我很喜欢这个答案! - AxelHvar 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"
number instanceof Integer
对于您的情况是否有效(因为instanceof
不能用于原始类型)。然而,如果数字被强制转换为(Integer) 42
,那么就会奏效。 - Naman