gpt4 book ai didi

java - 为什么我不能在 Java 中抛出或捕获泛型类的实例?

转载 作者:搜寻专家 更新时间:2023-10-31 20:10:06 26 4
gpt4 key购买 nike

我知道我不能在 Java 中抛出或捕获泛型类的实例,例如,下面的代码编译错误:

public static <T extends Throwable> void test(Class<T> t){
try{
//do work
}
catch (T e){// ERROR--can't catch type variable
Logger.global.info(...)
}
}

谁能解释一下 Java 禁止 throw 或 catch 泛型类实例的确切原因?

最佳答案

您无法捕获一般异常,因为 Java 语言规范明确禁止它。在 14.20 The try statement它说:

It is a compile-time error if a type variable is used in the denotation of the type of an exception parameter.

该部分没有解释原因,但最类似的原因是 <T extends Throwable>被删除为 Throwable ,因此您的代码实际上将被编译为:

public static void test(Class<? extends Throwable> t){
try{
//do work
}
catch (Throwable e){
Logger.global.info(...)
}
}

这不是您的代码表达的意图(很可能不是您想要的),因此语言规范明确禁止这样做。

请注意,允许抛出一般异常,但这通常只与在另一个抛出异常的方法周围有一些包装器的上下文相关。

关于java - 为什么我不能在 Java 中抛出或捕获泛型类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33706550/

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