Java 8:在验证字节码时将String []和int []合并到Object []中

时间:2017-08-27 11:05:51

标签: java jvm bytecode jvm-bytecode

我正在阅读JVM版本8规范的第4.10.2.2节(https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html)如何验证字节码。在这种情况下,当堆栈现在包含一个带有int []的槽来自一个源而一个String []来自另一个源时,控制流中会发生什么。

我阅读了以下内容,这些内容在JVM版本7 docs中没有出现:

  

如果相应的值都是数组引用类型,则检查它们的尺寸。如果数组类型具有相同的维度,则合并的值是对数组类型实例的引用,这是两种数组类型的第一个常见超类型。 (如果其中一个或两个数组类型都具有基本元素类型,则将Object用作元素类型。)

...

  

甚至可以合并int []和String [];结果是Object [],因为在计算第一个常见的超类型时使用Object而不是int。

这对我没有任何意义,因为这意味着可以将int []强制转换为Object []。但是在Java中,原始类型的数组不能转换为Object []。

有人能解释一下这背后的理由吗?

1 个答案:

答案 0 :(得分:3)

我不确定为什么该语言在规范中,但它没有描述JVM实际行为的方式(这是有道理的,因为正如你所指出的,所描述的行为是无意义的。)

你可以找到推理字节码验证器来源here,自2013年以来它没有改变。

作为额外的检查,我创建了一个合并int []和String []的测试文件,然后在结果中存储一个String。正如所料,我收到了验证错误(Java版本1.8.0_111)。