Java SE 6 と Java SE 7 の自動アンボックス動作の違いに注目しました。これら 2 つのバージョン間でのこの動作の変更に関するドキュメントが見つからないため、なぜそうなのか不思議に思っています。
簡単な例を次に示します。
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 が発生します。
これに関する参照はありますか?