扩展和装箱Java原语

zig*_*ggy 8 java autoboxing boxing wrapper primitive-types

扩展和装箱Java原语.

我知道不可能将包装类从一个扩展到另一个,因为它们不是来自同一个继承树.为什么不能将原语扩展到另一个原始类型并自动放大加宽的原语?

鉴于可以将一个byte参数传递给一个需要int的方法,为什么以下示例中的字节不能扩展为int然后装箱为Integer?

class ScjpTest{
    static void goInteger(Integer x){
        System.out.println("Going with an Integer");
    }

    static void goInt(int x){
        System.out.println("Going with an int");
    }

    public static void main(String args[]){
        byte b = 5;
        goInt(b);
        goInteger(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,goInt(b)编译器接受但goInteger(b)被拒绝.

DwB*_*DwB 6

简短的回答

java语言只支持某种程度的粗心.

更长的答案

我相信添加了自动装箱以支持开发人员疏忽.特别是在这样的情况下:"我需要一个Integer作为我想要调用的方法的参数,但是我有一个int.不知何故,新的Integer(int)永远不会出现在我脑海中.相反,我只是发送一个int并且java编译器会为我做新的Integer()调用.感谢java carelessness支持小组!"

设计自动装箱的人愿意支持1级粗心(int => Integer和back),但不愿意支持将较小的原始类型自动转换为较大的原始类型,同时自动创建和从原始类型包装类中提取.我怀疑这个的descision矩阵会比当前自动装箱方案的决策矩阵稍大一些.