值得一提的是,这是JLS实施此规则的相关部分。
首先,第8.4.8.2节。隐藏(按类方法)提供了一种方法隐藏的定义,该定义适用于此处:
如果C类声明或继承了一个
static方法m,则m可以说它 隐藏了
任何方法m',其中C的签名m是C的签名的子签名(第8.4.2节),m'否则C的超类和超接口可以通过代码访问。在C.
然后,第8.4.8.3节。覆盖和隐藏要求中指出:
覆盖或隐藏另一个方法(包括实现
abstract接口中定义的方法的方法)的方法可能不会声明比覆盖或隐藏的方法抛出更多的检查异常。更准确地说,假设B是类或接口,而A是B的超类或超接口,并且B中的方法声明
m2覆盖或隐藏m1A中的方法声明。然后:
- 如果
m2有一个throws提及任何检查的异常类型m1的throws子句,则必须有一个子句,否则会发生编译时错误。*对于的
throws子句中列出的每个检查的异常类型m2,必须在的throws子句的擦除(第4.6节)中出现相同的异常类或其超类型之一m1。否则,将发生编译时错误。
换句话说,错误消息不是编译器的疏忽,也不是对规范的误解。JLS专门指出,
throws子句冲突 是
方法隐藏(即静态方法)的错误。在回版本为1.0的每个JLS版本中都有与此等效的语言。
但是,对于这种情况下 为什么
存在约束,我无法确切回答您的问题。我无法想到任何需要约束的情况,因为与实例方法不同,调用静态方法实现的问题始终在编译时得到完全解决。
我敢打赌,谁先把这个限制放在langspec中,谁就太过谨慎了,他认为防止某事比允许某事更安全,然后发现它会引起问题,这是一笔小小的钱。Java语言设计并非没有缺陷功能(检查异常是其中之一),并且可以肯定地说这是另一种缺陷功能,但这只是一个猜测。



