如果使用它进行编译,
-Xlint则会收到警告:
c:UsersJonTest>javac -Xlint SneakyThrow.javaSneakyThrow.java:9: warning: [unchecked] unchecked cast throw (T) ex; ^ required: T found: Throwable where T is a type-variable: T extends Throwable declared in method <T>sneakyThrowInner(Throwable)1 warning
基本上是说“ 在执行时并没有 真正 检查这个强制转换”(由于类型擦除)-因此编译器无奈地假设您做的是正确的,知道它实际上不会被检查。
现在只有 编译器 关心已检查和未检查的异常-它根本不是JVM的一部分。因此,一旦您通过了编译器,就可以自由上班了。
我强烈建议您避免这样做。
在许多情况下,使用泛型时会进行“真实”检查,因为某些东西使用了所需的类型-但这并非 总是 如此。例如:
List<String> strings = new ArrayList<String>();List raw = strings;raw.add(new Object()); // Haha! I've put a non-String in a List<String>!Object x = strings.get(0); // This doesn't need a cast, so no exception...



