You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:52:33