我已经注意到Java SE 6和Java SE 7在自动拆箱行为上的差异。我想知道为什么会这样,因为我找不到这两个版本之间这种行为变化的任何文档。
这是一个简单的例子:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
使用Java SE 7中的javac可以很好地进行编译。但是,如果我给编译器提供“ -source 1.6”参数,则在最后一行会出现错误:
inconvertible types
found : java.lang.Object
required: int
我尝试下载Java SE 6以使用本机版本6编译器进行编译(没有任何-source选项)。它同意并给出与上述相同的错误。
那有什么呢?从更多的实验来看,Java 6中的拆箱似乎只能拆装明显(在编译时)属于装箱类型的值。例如,这在两个版本中都适用:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
因此,似乎在Java 6和7之间,取消装箱功能得到了增强,以便可以一键转换和取消装箱对象类型,而无需(在编译时)知道该值是正确的装箱类型。但是,通读Java 7发行时编写的Java Language Specification或博客文章,我看不到这件事有任何变化,所以我想知道变化是什么以及这个“功能”被称为什么?
只是出于好奇:由于更改,有可能触发“错误的”装箱:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
这样可以很好地编译,但是在运行时给出ClassCastException。
有什么参考吗?
Integer obj = new Integer(2); int x = (int)obj;
:关于Java 7的作品,提供了有关Java错误6