我有一个方法,它接受一个长原始值并基于它进行一些处理。原来是int,后来改了。实际调用此方法的代码是使用 Integer 调用此方法,这在之前是可以的,因为 java Autoboxing 和 Unboxing。
但是将其更改为 long 后,我的代码在按照我的预期构建时没有显示任何编译时错误。现在,如果我将其更改为 int 而不是 Integer,它会显示编译时错误,但 Integer 不会显示错误。
为什么会出现这种情况?
编辑:
class ABC {
public Customer customerExists(long cid) throws Exception {
...
}
}
class XYZ {
public void method() {
Integer customerId = null;
...
customerExists(customerId);
...
}
}
根据我的说法,这应该是一个编译时错误,但事实并非如此。
Java 版本 - openjdk版本“1.8.0_31” OpenJDK 运行时环境(内部版本 1.8.0_31-b13) OpenJDK 64 位服务器虚拟机(内部版本 25.31-b07,混合模式)
您可以测试一些更改,以改进您的代码,请查看这段代码:
class ABC {
public Customer customerExists(Number cid) throws Exception {
...
if( cid instanceof Integer) {
cid.intValue().....
}
}
}
class XYZ {
public void method() {
Integer customerId = null;
...
customerExists(customerId);
...
}
}
因此您可以传递任何类型的数字,请查看此类以转换为您需要的任何类型数字。 ( 数类
这里有两个因素起作用:自动装箱和加宽基元转换。
自动装箱,或者在本例中为自动拆箱,将在 Integer 和 int 之间进行隐式转换。
多亏了这个,你可以做一些事情
Integer x = 3;
int y = x;
其次,在以下情况下,当需要更大的类型时,java会自动进行加宽基元转换:
让我们举一些例子。
假设我们有
public void testMethod(long x)
我们可以这样称呼它:
testMethod(2);
2 是整数,将隐式映射为 long。 同样的事情也会发生在算术运算中,例如:
Short s = 1;
int x = s + 1;
Short
将被拆箱为short,然后隐式转换为int(因为1是int)
另请注意:
Short s = 1;
short s2 = s + 1;
不会编译,因为
s+1
已经是 int 了。
如果您想了解更多信息,请查看此处:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html