我注意到 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 语言规范或博客文章,我看不出这件事有什么变化,所以我想知道变化是什么,这个“特性”叫什么?
只是好奇:由于更改,可能会触发“错误”的拆箱:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
这编译得很好,但在运行时会给出 ClassCastException。
对此有任何参考吗?