13

私は、C プログラマーによって数年前に実装された古い Java コードを作業中に偶然見つけました。そのコードが (たとえコンパイルして動作するとしても) 実際に有効な Java コードであるかどうかについて議論を始めずにはいられませんでした。

final Object o = Boolean.TRUE;
boolean b = (boolean) o;

これは本質的に問題のコードです。ご覧のように、Object からプリミティブ ブール値へのあまり適切でないキャストがあります。これは不可能なはずですが、いくつかの暗黙のボクシング マジックのおかげでたまたま機能しています。

私が次のことをしたら

final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
  b = (boolean) o;
}

o が b にキ​​ャストされる行で、「キャストは指定されたインスタンスと互換性がありません」という警告さえ表示されます。これは明らかに真実ですが、暗黙のボクシングのためにまだ機能します。

問題は、そのキャストは実際に Java 仕様で許可されているので、将来の JVM バージョンで動作するはずなのかということです。それとも、たまたま現在のバージョンで動作し、将来の JVM アップデートで動作しなくなる可能性がありますか?

4

2 に答える 2

8

はい。合法です。JLS-5.1.8を参照してください。(一部)と言うUnboxing Conversion

ボックス化解除変換は、参照型の式をプリミティブ型の対応する式に変換します。具体的には、次の 8 つのコンバージョンはボックス化解除コンバージョンと呼ばれます。

  • ブール型からブール型へ
于 2016-11-23T17:45:53.653 に答える