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

Java JLS方法重写规则中unerased throws clause术语含义咨询

「unerased throws clause of m1」术语解释

这个术语是JLS里和「类型擦除后的throws子句」对应的概念,指未经过Java泛型类型擦除、保留了方法原始声明完整类型信息的父类/父接口方法m1的throws子句。


核心区分(和擦除后的throws子句对比)

Java泛型仅存在于编译期,运行时会执行类型擦除,当方法的throws子句用到泛型参数时,擦除前后的内容会存在差异:

  • 擦除后的throws子句:所有带泛型参数的异常类型会被替换为它的上界(比如T extends IOException会被替换为IOException),对应JLS规则2的校验依据,是编译期硬错误的校验标准。
  • 未擦除的throws子句:完全保留方法声明时的泛型类型信息,不会做任何类型替换,对应JLS规则3的校验依据,是编译期unchecked警告的校验标准。

示例说明

我们可以通过泛型类方法重写的场景直观理解:

// 父类泛型声明
class Base<T extends IOException> {
    // m1的未擦除throws子句:[T]
    // m1的擦除后throws子句:[IOException]
    public void test() throws T {}
}

// 子类指定泛型参数为FileNotFoundException
class Sub extends Base<FileNotFoundException> {
    @Override
    // 重写方法抛出两种checked异常
    public void test() throws FileNotFoundException, EOFException {}
}

上述代码的校验逻辑:

  1. 规则2校验(擦除后版本):子类抛出的FileNotFoundException、EOFException的公共超类型IOException存在于父类擦除后的throws列表中,因此不会触发编译错误。
  2. 规则3校验(未擦出版本):适配父类的泛型参数后,父类未擦除的throws子句实际为FileNotFoundException,而子类抛出的EOFException没有对应的超类型存在于该列表中,因此编译器会抛出unchecked警告。

内容的提问来源于stack exchange,提问作者SternK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:15:05