gpt4 book ai didi

java - 为什么 Java 泛型可以强制转换不可赋值的类型(Every Exception to RuntimeExecption)?

转载 作者:行者123 更新时间:2023-11-30 07:00:06 25 4
gpt4 key购买 nike

我想知道为什么下面的代码有效:

public static void throwUnchecked(Exception e) {
TestGenericExceptionCast.<RuntimeException> doThrowUnchecked(e);
}

@SuppressWarnings("unchecked")
private static <T extends Exception> void doThrowUnchecked(Exception toThrow) throws T {
throw (T) toThrow;
}

public static void main(String[] args) {
throwUnchecked(new Exception());
}

为什么异常可以通过泛型转换为RuntimeException?

知道了:

根本没有转换发生,因为没有对象被分配给类型为 T 的东西。

编译器被骗了,再也看不出它是一个已检查的异常。

最佳答案

throw (T) toThrow;并没有真正施展 toThrowRuntimeException .删除后,类型绑定(bind) <T extends Exception>意味着实际发生的转换是 throw (Exception) toThrow; ,效果非常好。

但是,如果您将签名更改为:

private static <T extends RuntimeException> void doThrowUnchecked(Exception toThrow) throws T

它仍然会通过编译(因为 RuntimeExceptionException 的子类型),但是 throwUnchecked(new Exception());会抛出 ClassCastException ,因为异常的运行时类型 - java.lang.Exception - 不能转换为 java.lang.RuntimeException .

如果这些方法的目的是将checked exception转换为unchecked exception,可以删除这些方法并替换

throwUnchecked(new Exception());    

throw new RuntimeException (new Exception());

这会将已检查的异常包装在未检查的异常中。

关于java - 为什么 Java 泛型可以强制转换不可赋值的类型(Every Exception to RuntimeExecption)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com