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の間でボックス化解除機能が強化され、値が適切なボックス化されたタイプであることを(コンパイル時に)認識せずに、1度にオブジェクトタイプをキャストおよびボックス化解除できるようになりました。ただし、Java 7がリリースされたときに書かれたJava言語仕様やブログの投稿を読んで、私はこの点の変更を確認できないので、何が変更され、この「機能」が何と呼ばれるのか疑問に思っています。 ?
ただの好奇心:変更により、「間違った」開封解除をトリガーすることが可能です。
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でエラーが発生します