gpt4 book ai didi

java - 为什么 Java 在实现两个都声明 X 但 throws 子句不同的接口(interface)时只允许一个方法 X?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:46 24 4
gpt4 key购买 nike

这与以下问题密切相关,但不是同一个问题:Java - Method name collision in interface implementation

当有两个 Java 接口(interface)共享一个具有几乎相同签名的方法时,如下所示:

import java.io.IOException;

interface ISomething1 {
void doSomething();
}

interface ISomething2 {
void doSomething() throws IOException;
}

class Impl implements ISomething1, ISomething2 {
public void doSomething() {
throw new IOException(); // this does not compile since ISomething1.doSomething does not declare a throws clause
}

public static void main(String args[]) throws IOException {
Impl i = new Impl();
i.doSomething();
}
}

为什么 Java 强制只有一个方法实现这两个接口(interface)方法,即使从技术上讲它们的签名不同?

另请注意,在上面的示例中,Impl.doSomething 的实现不需要抛出 IOException,否则编译器会提示 ISomething1.doSomething 还必须声明它抛出 IOException 有效地使 ISomething2.doSomething 中的 throws 子句无用。

我在这里遗漏了什么明显的东西吗?预先感谢您的回复。

最佳答案

您可能希望编译器知道您的客户端代码是否打算调用 void doSomething();void doSomething() throws IOException;处理异常。

但 Java 编译器并没有那么聪明。

(当然,如果抛出的异常是 RuntimeException,则不可能推断出客户端想要调用哪个方法 - 无论编译器多么聪明)。

唯一构成方法签名类型的是名称和参数。

关于java - 为什么 Java 在实现两个都声明 X 但 throws 子句不同的接口(interface)时只允许一个方法 X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5631135/

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