class Test{
static void testCase_1(long l){System.out.println("Long");}
static void testCase_2(Long l){System.out.println("Long");}
public static void main(String args[]){
int a = 30;
testCase_1(a); // Working fine
testCase_2(a); // Compilation time error
//Exception - The method testCase_2(Long) in the type Test is not applicable for the arguments (int)
}
}
testCase - 1:int - 长期正常工作
testCase - 2:int to L ong抛出异常
为什么testCase_2()方法抛出编译异常?
答案 0 :(得分:10)
当你这样做时
testCase_1(a);
您正在传递int
而不是long
,widening primitive conversion
正在发生。
在第二种情况下
testCase_2(a);
您无法将基元转换为对象。自动装箱/取消装箱不起作用,因为Long
不是int
的包装。
答案 1 :(得分:3)
调用testCase_1(a)
时,a
会自动从int
转换为long
。
int
文字与long
完全兼容(反之亦然),因为int
类型完全适合 long
一个。这就是为什么第一个声明编译得很好。
但是,在调用testCase_2(a)
时,您尝试将int
变量自动转换(投射或自动装箱)到Long
。自动装箱在这里不会发生,也不可能进行铸造,这就是编译器抛出错误的原因。
如果你这样做了:
testCase_2(Long.valueOf(a));
然后一切都会好的。