有人可以解释为什么第一个演员没有给CCE吗?
public class Test {
public static void main(String[] args) throws Throwable {
Test.<RuntimeException>throwIt(new Exception());
}
@SuppressWarnings("unchecked")
private static <T extends Throwable> void throwIt(Throwable throwable) throws T {
throw (T) throwable; // no ClassCastException
throw (RuntimeException) throwable; // ClassCastException(as it should be)
}
}
P.S。评论一个演员(否则不会编译)。
答案 0 :(得分:1)
这是Java泛型实现的特性,它是通过类型擦除实现的,这就是为什么(T)强制转换实际上将它转换为最左边的Throwable。因为,新的Exception()会产生一个Throwable对象,你可以安全地抛出它。
您可以在JSL中查看它 http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#108979