微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javac和基元:装箱与未装箱

如何解决Javac和基元:装箱与未装箱

|| 我的问题是:为什么也有可能必须将原始类型包装在一个对象中,同时也有可能让编译器为您设置合适的东西? 调用原始值x \的方法可以从x.call()转换为X.call(x)-这就是我在下面尝试说明的内容。 泛型不是在运行时保留的(对吗?),所以不是在运行时需要访问类信息的情况-您可以简单地将integer的每个实例替换为int并如上所述重写方法调用,并且最终得到可执行代码。 所以基本上,我要问的是:我在这里想念什么? 我已经想了好一阵子了:为什么Java编译器不能翻译...
int a = 482;
int b = 12;
System.out.println((a + b).toHexString());
...到以下代码...
int a = 482;
int b = 12;
System.out.prinln(Ints.toHexString(a + b));
...从而消除了装箱和拆箱的全部需求? (因此,编译方法调用(静态)函数调用,并在需要时保留Int.class的单​​个实例,例如在调用Ints.getClass(_)之后?) 为了清楚起见添加了注释:   @Adam:不,我不认为这会导致   装箱/拆箱。示例尝试   说明原始图元可能是   被视为语言中的对象,   但由编译器作为原语。   这将删除(轻微)   运行时的开销,以及令人困惑的   语言中的事物。因此   预期的问题正好是:为什么   不是非常有才华的编译器   开发人员选择此解决方案?因为如果没有的话   必须明确表明我是   没有看到。我想知道什么   它是。 –佩皮金     

解决方法

我想你的意思是
Integer.toHexString
,而不是
Ints.toHexString
。后者不是
java.lang
的一部分,并且编译器将无法了解任何内容。 从理论上讲,如果Java语言指定了这样的转换,则编译器可以将
(a + b).toHexString()
的调用转换为
Integer.toHexString(a + b)
。 (例如,将“ 7”到“ 8”的自动装箱指定为“ 9”。) 我想Java语言维护者认为这对于Java程序员来说太“神奇”了-在所有版本的Java中,原始类型都没有方法或字段。通常,Java旨在避免语法糖-这就是为什么它比大多数其他语言更冗长的原因。     ,因此,我们可以将调用原始类型的方法映射到其包装器类型的静态方法。 这根本与装箱/拆箱无关,用另一种方式编写相同的方法调用只是语法上的糖-只是数量很少的方法,这些方法在包装器类中预定义。 当您要将原始值当作对象时,装箱是必要的,例如: 将其传递给仅接受对象的方法 将其放在对象类型的变量中 从必须返回对象的方法返回它 这些的特殊情况(但很重要)是: 放入一个对象数组 放入收藏夹 如果我们得到了这种装箱的原语并想要具有其纯格式,则必须进行拆箱,例如,在调用返回对象的方法或从变量中获取值之后。 在Java 5(或1.5)之前,我们必须通过
.valueOf()
方法或
toXXX()
手动进行所有装箱和拆箱。现在,它会在必要时自动完成(自动装箱)。     ,编译器将做什么
List<Integer> list = new ArrayList<Integer>();
list.add(5);
int i = list.get(0);
您在这里需要一个Integer实例,因此需要装箱/拆箱。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。