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) { }