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