完整静态检查流程
本页把名称解析、类型检查、流分析和泛型求解连接成一个可实现的编译管线。
第一阶段:声明收集
编译器读取 package 与 import,收集源码根中全部顶层类型和函数签名,建立名义类型图。此阶段检测重复名称、继承环、不可见类型泄露和错误 arity,不依赖文件或函数体顺序。
第二阶段:类型图验证
- 解析 extends 与 implements;
- 验证 class 单继承和 interface 多继承;
- 检查覆盖签名、可见性和返回兼容;
- 展开泛型 bounds 并拒绝非法循环;
- 为 enum 固定 variant 集合;
- 为 runtime 类型建立 reified 描述。
第三阶段:函数体
函数体按 lexical scope 解析局部名称。每个表达式得到静态类型,每条语句更新确定赋值集合和 null-state。return、break、continue 与 throw 必须到达合法目标。
调用解析
按名称和参数名选出候选,执行泛型推断,应用仅允许的安全转换,然后选择唯一最佳 overload。只靠返回类型区分的 overload 无法声明。
控制流
if 的分支分别分析并在汇合点取确定赋值交集。nullable 状态根据条件收窄。for 体按可能执行零次处理。每个 switch 递归检查模式穷尽与不可达 case。
控制表达式收集每条 break value 的类型并求唯一共同类型。缺失正常路径值是错误,不插入 null。
值模型检查
- value 字段构造后不可写;
- class 普通赋值保留对象身份;
- value 普通赋值产生逻辑独立值;
ref<T>只接受 value,并保持存储位置 identity;- 逃逸分析和复制消除只能在不改变这些结果时执行。
诊断要求
错误包含主源码位置、相关声明位置、实际/期望类型和一条可操作说明。泛型错误展示替换后的候选签名;流错误说明哪条路径缺少赋值或结果。
运行时保证
通过静态检查的程序保留完整动态类型和泛型参数。运行时仍可能产生显式 cast 失败、Exception、I/O 错误和资源耗尽,但不应发生未检查成员访问或隐式 null 解引用。