5

JVM バージョン 8 の仕様のセクション 4.10.2.2 ( https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html ) のバイトコードの検証方法を読んでいます。この場合、スタックに、あるソースから来る場合は int[] を持つスロットが含まれ、別のソースから来る場合は String[] を持つスロットが含まれるとき、制御フローで何が起こりますか。

以下を読みましたが、JVM バージョン 7 のドキュメントにはありませんでした。

対応する値が両方とも配列参照型である場合、それらの次元が調べられます。配列型の次元が同じ場合、マージされた値は、両方の配列型の最初の共通スーパータイプである配列型のインスタンスへの参照です。(配列型のいずれかまたは両方にプリミティブ要素型がある場合、代わりに Object が要素型として使用されます。)

...

int[] と String[] もマージできます。最初の共通スーパータイプを計算するときに、int の代わりに Object が使用されるため、結果は Object[] になります。

これは、int[] を Object[] にキャストできることを意味するため、私には意味がありません。しかし、プリミティブ型の Java 配列は Object[] にキャストできません。

誰かがこの背後にある理論的根拠を説明できますか?

4

1 に答える 1