gpt4 book ai didi

java - 为什么向 Java 接口(interface)添加新方法会破坏依赖旧版本的客户端?

转载 作者:行者123 更新时间:2023-11-29 03:42:22 25 4
gpt4 key购买 nike

在 Java 中,当您向接口(interface)添加新方法时,您会破坏所有客户端。当你有一个抽象类时,你可以添加一个新方法并在其中提供一个默认实现。所有客户将继续工作。

我想知道为什么界面要这样设计?

所有旧方法仍然存在,因此似乎没有向后兼容性问题。 (当然需要有某些异常(exception),但我认为能够在不破坏客户端的情况下向 java 接口(interface)添加新方法可能是一个非常好的主意......)

非常感谢您的评论。

最佳答案

我可以看到一些可能的中断

  • 您假设客户将使用新的重载方法,但他们不会这样做,因为代码尚未重新编译。
  • 您添加一个客户已有的方法,该方法执行不同的操作。
  • 你添加了一个方法,这意味着它们的子类在重新编译时会中断。恕我直言,这是可取的。
  • 您更改返回类型、方法名称或参数类型,这将在运行时导致错误。
  • 交换相同类型的参数。这可能是最严重和最微妙的错误。 ;)

恕我直言,这些细微的问题更有可能让您感到悲伤。但是,我不认为简单地添加一个方法会破坏代码,我也不认为如果客户的代码没有出现运行时错误就意味着他们使用的是最新版本的任何东西。 ;)


如果我编译这段代码

public interface MyInterface {
void method1();

// void method2();
}

public class Main implements MyInterface {
@Override
public void method1() {
System.out.println("method1 called");
}

public static void main(String... args) {
new Main().method1();
}
}

它打印

method1 called

然后我取消注释 method2() 并只重新编译接口(interface)。这意味着接口(interface)有一个 Main 没有实现的方法。然而,当我在不重新编译 Main 的情况下运行它时,我得到了

method1 called

如果我有

public class Main implements MyInterface {    
public void method1() {
System.out.println("method1 called");
}

public void method2() {
System.out.println("method2 called");
}

public static void main(String... args) {
new Main().method1();
}
}

并且我在 //method2() 注释掉的情况下运行,我没有遇到问题。

关于java - 为什么向 Java 接口(interface)添加新方法会破坏依赖旧版本的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561413/

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