计算Java参数化类型的超类型时如何避免无限循环
推演中的核心误解修正
你推演的无限循环场景实际不会出现,核心是两个规则被忽略了:
- 捕获转换的边界收缩规则:JLS §5.1.10明确规定,捕获转换生成的新类型变量的上界会自动合并收缩,不会保留无意义的嵌套捕获变量引用。你例子中对
Iterable<? extends CAP extends Object>做捕获转换时,新生成的捕获变量的上界直接是Object,不会出现CAP extends CAP extends Object这类无限嵌套的边界结构。 - 类型等价性去重规则:计算超类型传递闭包时的去重不是按字面字符串匹配,而是按类型的语义等价性判断:两个参数化类型只要对应同一个泛型声明,且所有位置的类型实参满足等价性(通配符上下界等价、捕获变量边界等价、类型变量声明同源),就会被判定为同一个类型,不会重复处理。
正确的循环终止方案
只需要严格遵循以下两个规范要求即可完全避免无限循环:
- 每次生成新的超类型后,先和已访问的类型集合做语义等价性比对,已存在的直接跳过,无需递归处理其超类型
- 捕获转换严格按JLS规则实现,对生成的类型变量边界做自动收缩,所有边界最终都会收敛到
Object或其他明确的非类型变量边界,不会无限增长
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

