接受 long 值的 java 方法应该接受 Integer 对象吗?

问题描述 投票:0回答:2

我有一个方法,它接受一个长原始值并基于它进行一些处理。原来是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,混合模式)

java long-integer
2个回答
0
投票

您可以测试一些更改,以改进您的代码,请查看这段代码:

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);
       ...
    }
}

因此您可以传递任何类型的数字,请查看此类以转换为您需要的任何类型数字。 ( 数类


0
投票

这里有两个因素起作用:自动装箱和加宽基元转换。

自动装箱,或者在本例中为自动拆箱,将在 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

© www.soinside.com 2019 - 2024. All rights reserved.