gpt4 book ai didi

java - 在子类中隐藏静态方法时的签名差异

转载 作者:太空狗 更新时间:2023-10-29 22:57:59 26 4
gpt4 key购买 nike

最近我在玩一些简单的 Java 代码,使用 main 方法来快速测试我编写的代码。我最终遇到了两个类似的类:

public class A {
public static void main(String[] args) {
// code here
}
}



public class B extends A {
public static void main(String[] args) throws IOException {
// code here
}
}

令我惊讶的是,代码停止编译,Eclipse 提示 Exception IOException is not compatible with throws clause in A.main(String[])

好吧,这两个方法都是静态的,B 中的 main 函数只是对 A 隐藏了一个,所以我认为有他们之间完全没有关系。在静态方法中,我们没有多态性,调用在编译期间绑定(bind)到具体方法实现,因此我不明白为什么 B 中的 main 不能抛出未声明的异常在 A 中的 main 签名中。

为什么 Java 设计者决定强制执行这样的约束,如果编译器不强制执行约束,在什么情况下会导致问题?

最佳答案

就其值(value)而言,这里是执行此规则的 JLS 的相关部分。

首先,§8.4.8.2. Hiding (by Class Methods)给出适用于此处的方法隐藏的定义:

If a class C declares or inherits a static method m, then m is said to hide any method m', where the signature of m is a subsignature (§8.4.2) of the signature of m', in the superclasses and superinterfaces of C that would otherwise be accessible to code in C.

然后,§8.4.8.3. Requirements in Overriding and Hiding指出:

A method that overrides or hides another method, including methods that implement abstract methods defined in interfaces, may not be declared to throw more checked exceptions than the overridden or hidden method.

More precisely, suppose that B is a class or interface, and A is a superclass or superinterface of B, and a method declaration m2 in B overrides or hides a method declaration m1 in A. Then:

  • If m2 has a throws clause that mentions any checked exception types, then m1 must have a throws clause, or a compile-time error occurs.

  • For every checked exception type listed in the throws clause of m2, that same exception class or one of its supertypes must occur in the erasure (§4.6) of the throws clause of m1; otherwise, a compile-time error occurs.

换句话说,错误消息不是编译器的疏忽,也不是对规范的误解; JLS 特别强调 throws 子句冲突方法隐藏错误(即静态方法)。回到 1.0 的每个 JLS 版本中都有与此等效的语言。

但是,我无法明确回答您关于为什么在这种情况下存在约束的问题。我无法想象任何需要约束的情况,因为调用哪个静态方法实现的问题总是在编译时完全解决,这与实例方法不同。

我敢打赌,第一个在 langspec 中设置该约束的人只是过于谨慎,他们认为阻止某些事情比允许它然后发现它会导致问题更安全。 Java 语言设计存在/并非没有其公平份额的缺陷特性(检查异常是其中之一),这可能是另一个,但这只是一个猜测。

关于java - 在子类中隐藏静态方法时的签名差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930026/

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