私は、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 アップデートで動作しなくなる可能性がありますか?