如果使用它进行编译,-Xlint
则会收到警告:
c:\Users\Jon\Test>javac -Xlint SneakyThrow.java
SneakyThrow.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...