Null、方法调用中的基元数据值和包装类



>我有以下代码片段

public class Sample {
public static void main(String[] args) {
test(1);//fine & output - int
test(1L);//fine & output - long
//test(null);  fine & output - Integer
test(12233333333);//error
}
static void test(int a){
System.out.println("int");
}
static void test(Integer a){
System.out.println("Integer");
}
static void test(long a){
System.out.println("long");
}
static void test(Long a){
System.out.println("Long");
}
static void test(List<Integer> a){
System.out.println("List");
}
}

我的问题是,

为什么数字值总是引用 int(基元类型),而 null 引用重载中最具体的方法?

为什么我们需要含蓄地说 1L 为什么如果你给出大数字(1233333333333)不需要长值? 你能有人解释这些吗?

为什么数字值总是引用 int(基元类型)而 null 引用 重载中最具体的方法?

因为默认情况下编译器是指不带后缀的数字的 32 位整数运算lORL(对于long)。

为什么我们需要含蓄地说 1L 为什么它不需要long值,如果你 给出大数(1233333333333)?你能有人解释这些吗?

正如我上面所说,默认情况下它指的是整数运算,对于这么大的数字,它超出了Integer的范围,因为这个数字将被视为没有后缀的整数lL所以它将引用以int作为参数的方法,但出现错误,值超出范围。

让我们看看JLS怎么说..


JLS 4.2如果移位运算符以外的整数运算符至少有一个 long 类型的操作数,然后使用 64 位执行操作 精度,并且数值运算符的结果类型为 long。 如果另一个操作数不长,则首先将其加宽 (§5.1.5) 以键入 长按数字提升 (§5.6)。

否则,操作使用 32 位精度执行,并且 数值运算符的结果为 int 类型。如果任一操作数 不是 int,它首先通过数字提升扩大为类型 int。

1233333333333 是一个 int 文字,所以你可以使用它,但你必须把它转换为 long,在这种情况下,编译器将进行转换。它不起作用,因为它太大而不能成为整数。

编译器不能只假设它很长的原因是因为它们与 123 是一个 int 不一致。

最新更新