为什么int类型值不被装箱为Integer

时间:2013-02-07 20:20:46

标签: java

public class Test {
static void test(Integer x) {
    System.out.println("Integer");
}

static void test(long x) {
    System.out.println("long");
}

static void test(Byte x) {
    System.out.println("byte");
}

static void test(Short x) {
    System.out.println("short");
}

public static void main(String[] args) {
    int i = 5;
    test(i);
}
}

输出值为“long”。

只能告诉我它为什么不是“Integer”,因为在Java中,int值应该是自动装箱的。

2 个答案:

答案 0 :(得分:14)

当编译器可以选择将int扩展为long或将int列为Integer时,它会选择最便宜的转换:扩展为{ {1}}。 section 5.3 of the Java language specification中描述了方法调用上下文中的转换规则,section 15.12.2(具体为section 15.12.2.5中描述了当存在多个潜在匹配时选择匹配方法的规则,但是警告说这是非常密集的阅读。)

答案 1 :(得分:0)

这些只接受测试方法的integer类的实例,它不是java的原始整数类型。 Integer是一类java,而不是int类的基本类型String。另一方面,long是一种基本类型,它有int的子集,因此它选择了该参数,因为它是最接近的匹配。您也可以尝试使用double参数。当int或long签名缺少方法参数时,它选择使用double的一个,因为它是最接近的匹配。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html

试试这个:

public static void main(String[] args) {
    int i = 5;
    test(i);

    Integer smartInt= new Integer(5);
    test(smartInt); 
}