为何代码Integer[] x = (Integer[]) new Object[100];可编译通过?
为什么
Integer[] x = (Integer[]) new Object[100];能编译通过? 编译期静态类型检查逻辑
Java编译器处理显式类型转换时,只要目标类型和源类型在类型层级上存在兼容可能性,就会允许编译。这里:
Integer是Object的子类,因此Integer[]和Object[]同属对象数组类型体系;- 编译器无法在编译阶段确认数组的实际运行时类型,只能基于静态类型判断转型是否“有可能合法”——比如如果某个
Object[]实际存储的是Integer实例,那转型就是合法的,因此编译器不会阻止这段代码编译。
数组协变特性的影响
数组在Java中是协变的:如果A是B的子类,那么A[]可以被视为B[]的子类。反过来,编译器允许将B[]显式转型为A[],因为从静态类型逻辑上,这种转型存在理论上的合法性(尽管多数实际场景下会运行时出错)。
关键提醒:运行时会抛出异常
虽然编译通过,但这段代码执行时会直接抛出ClassCastException。因为数组的运行时类型是不可变的,实际创建的是Object[]实例,无法强制转换为Integer[]类型——运行时JVM会严格检查数组的实际类型,发现不匹配就抛出异常。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

