Java中的内部静态与非静态异常类

Dee*_*mar 5 java generics exception

我确实注意到有关静态和非静态内部异常类的奇怪行为。

例如下面的代码不会编译:

public class MyClass<T> {
  private class MyInnerException extends Exception { // won't compile    
    ..
  }
}
Run Code Online (Sandbox Code Playgroud)

但下面的代码将编译:

public class MyClass<T> {
  private static class MyInnerException extends Exception { // will compile    
    ..
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

有一点是肯定的,由于类型擦除,我们不能有泛型异常,但是上面的不是泛型异常类,而是在泛型类中。但是如果它是静态的它是允许的,但如果它是非静态的它是不允许的?

后续问题,是否因为 Generic 的类型擦除功能而不允许通用异常,就像这里提到的:https : //www.mscharhag.com/java/java-exceptions-and-generic-types 或者还有其他一些原因要吗?

Era*_*ran 2

\n

有一件事是肯定的,由于类型擦除,我们不能有泛型异常,但上面的不是泛型异常类,而是在泛型类内部。

\n
\n

您的内部类(第一个片段)一个泛型类,因为它的封闭类是一个泛型类,并且封闭类是内部类的一部分。如果没有相应的封闭类实例,则无法创建内部类的实例。

\n

至于为什么泛型类不能扩展Exception

\n
\n

如果泛型类是 Throwable (\xc2\xa711.1.1) 的直接或间接子类,则这是一个编译时错误。

\n

由于 Java 虚拟机的 catch 机制仅适用于非泛型类,因此需要此限制。

\n
\n

( JLS 8.1.2 )

\n

即 catch 子句无法区分MyClass<String>.MyInnerExceptionMyClass<Integer>.MyInnerException,因此不允许使用通用异常类。

\n