Java 直接一般例外

Java 直接一般例外,java,exception,generics,Java,Exception,Generics,我的问题是这个问题的后续问题: 这个问题得到了完美的回答,但仅限于间接通用例外,即: public class MyException<T> extends Exception { 但这是阻止它的一个好理由吗? 同样的效果也可以在没有泛型的情况下实现: catch(Exception e) { } catch(IOException e { } 下面是上述限制的详细说明。如果我们的异常类型是泛型的,我们在编译时不知道实际的类型,而在运行时,该类型将被删除throwing这样的

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

这个问题得到了完美的回答,但仅限于间接通用例外,即:

public class MyException<T> extends Exception {
但这是阻止它的一个好理由吗? 同样的效果也可以在没有泛型的情况下实现:

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


下面是上述限制的详细说明。

如果我们的异常类型是泛型的,我们在编译时不知道实际的类型,而在运行时,该类型将被删除
throw
ing这样的异常是可能的,因为
Class
允许我们构造实例,但是
catch
ing必须知道编译时要匹配的类型。但是,它无法知道类型,因为它不是在catch站点指定的。

因为在Java类型中,变量,即T,是由于

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

因此,您的catch block不可能知道T最初是什么。不,你不能把它当作基本类型。那会做完全不同的事情。如果你有

catch(T e) { }
catch(MyBaseException e) { }
catch(MyApplicationException e) { }
T扩展了MyBaseException。看到了吗?那是怎么很快变得很糟糕的

阅读更多精彩文章


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

不可能在运行时检查异常是否是
T
的实例。
catch(Exception e) { }
catch(IOException e { }
catch(T e) { }
catch(MyBaseException e) { }
catch(MyApplicationException e) { }