gpt4 book ai didi

java - 直接通用异常

转载 作者:行者123 更新时间:2023-12-01 03:42:18 25 4
gpt4 key购买 nike

我的问题是这个问题的后续问题:

Why doesn't Java allow generic subclasses of Throwable?

问题得到了完美的回答,但仅限于间接一般异常,即:

public class MyException<T> extends Exception {

剩下的是直接泛型:

public static <T extends Exception> void checkForException(Class<T> exType) {

try {
// some code
} catch (T e) {
e.printStackTrace();
}
}

为什么不允许这样做?

不过,我认为这是不允许的唯一原因是 T 可能是一种类型,它也被显式捕获:

// if T is IOException
catch(T e) { }
catch(IOException e) { }

但这是阻止它的充分理由吗? 同样的效果,也可以在没有泛型的情况下完成:

catch(Exception e) { }
catch(IOException e { }

这是 documentation上述限制。

最佳答案

因为在 Java 类型变量中,即 Tnot reifiable由于 Type Erasure

这意味着编译器在运行时根本没有T

因此,您的 catch block 不可能知道 T 最初是什么。不,您不能只将其视为基本类型。那会做一些完全不同的事情。如果你有会怎样

catch(T e) { }
catch(MyBaseException e) { }
catch(MyApplicationException e) { }

T 扩展MyBaseException。看到它是如何变得非常糟糕的吗?

在优秀的 Java Generics FAQs - Under The Hood Of The Compiler 中阅读更多内容

我个人从来不喜欢类型删除,但语言设计者发誓他们有使用它的理由。所以我们到了。

关于java - 直接通用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30643677/

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