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 {} }
上述代码的校验逻辑:
- 规则2校验(擦除后版本):子类抛出的
FileNotFoundException、EOFException的公共超类型IOException存在于父类擦除后的throws列表中,因此不会触发编译错误。 - 规则3校验(未擦出版本):适配父类的泛型参数后,父类未擦除的throws子句实际为
FileNotFoundException,而子类抛出的EOFException没有对应的超类型存在于该列表中,因此编译器会抛出unchecked警告。
内容的提问来源于stack exchange,提问作者SternK
相关产品推荐
相关产品推荐

