Java SneakyThrow von Ausnahmen, geben Sie Erasure ein

Kann jemand diesen Code erklären?

public class SneakyThrow {


  public static void sneakyThrow(Throwable ex) {
    SneakyThrow.<RuntimeException>sneakyThrowInner(ex);
  }

  private static <T extends Throwable> T sneakyThrowInner(Throwable ex) throws T {
    throw (T) ex;
  }



  public static void main(String[] args) {
    SneakyThrow.sneakyThrow(new Exception());
  }


}

Es mag seltsam erscheinen, aber dies führt nicht zu einer Ausnahmebedingung und ermöglicht es, eine aktivierte Ausnahme auszulösen, ohne sie in der Signatur deklarieren zu müssen, oder sie in eine nicht aktivierte Ausnahme einzuschließen.

Beachten Sie, dass wedersneakyThrow(...) oder der main deklariert eine aktivierte Ausnahme, aber die Ausgabe ist:

Exception in thread "main" java.lang.Exception
    at com.xxx.SneakyThrow.main(SneakyThrow.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Dieser Hack wird in Lombok mit der Annotation @SneakyThrow verwendet, die es ermöglicht, geprüfte Ausnahmen zu werfen, ohne sie zu deklarieren.

Ich weiß, dass es etwas mit dem Löschen von Texten zu tun hat, aber ich bin mir nicht sicher, ob ich jeden Teil des Hack verstehen kann.

Bearbeiten: Ich weiß, dass wir eine einfügen könnenInteger in einemList<String> und diese Unterscheidung zwischen aktivierten und deaktivierten Ausnahmen ist eine Funktion zur Kompilierungszeit.

Beim Casting von einem nicht generischen Typ wieList zu einem generischen Typ wieList<XXX> Der Compiler gibt eine Warnung aus. Es ist jedoch weniger üblich, direkt auf einen generischen Typ wie zu konvertieren(T) ex im obigen Code.

Wenn Sie möchten, ist der Teil, der mir seltsam vorkommt, dass ich das in der JVM verstehe. AList<Dog> undList<Cat> sieht genauso aus, aber der obige Code scheint zu bedeuten, dass wir endlich auch einer Variablen vom Typ Dog oder so etwas einen Wert vom Typ Cat zuweisen können.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage