1

我刚刚遇到一个关于更改 API 的真正问题。我想更多地了解这个话题。使用以下示例作为演示。

有 4 个简单的类,子类扩展了父类。PubAPI 是提供公共方法以供使用的类。客户端类调用 PubAPI 的公共方法。

public class Parent
{
}

public class Child extends Parent
{
}


public class PubAPI
{
public Parent getChild(){
    return new Child();
}
}


public class Client
{
public static void main(String[] args)
{
    System.out.println(new PubAPI().getChild());
}
}

前 3 类由 API 制造商提供,假设上面的版本是版本 1。

在版本 2 中,PubAPI 类更改为返回子类型:

public class PubAPI
{
public Child getChild(){
    return new Child();
}
}

3 API 提供者类现在在版本 2 中,而如果我们不重新编译“客户端”类并使用其版本 1 生成的类文件。IT 将在 java 运行时失败,并出现错误找不到版本 1 方法(因为返回类型更改)。

我以前不知道,我想知道是否有人对这个主题有更多了解,例如,如果公共 API 添加了一个 throw,或者添加了一个同步或类成为 final 等。在这种情况下,将如何他有。

总之,其他人使用的 API 类的公共 API/类字节码级别兼容性规则是什么。

谢谢。

4

1 回答 1

2

编辑:两周前你问了几乎完全相同的问题并接受了答案。我想知道是什么促使你再次问,你认为规则不会在两周内改变,是吗?

您在关键字字节码级别兼容性方面走在了正确的轨道上。它被称为二进制兼容性,您可以在网上查找。例如,这里

这些规则一开始并不总是很容易理解,但当你遇到错误并考虑它们时通常是有意义的。最好的办法是尝试您列出的个别案例,当您在 JLS 中确认错误时确认这是不兼容的,然后尝试为自己合理化为什么会这样。

这个问题似乎讨论了完全相同的问题。eclipse it 站点上的文档比 JLS 更容易阅读。

于 2011-09-22T03:42:21.283 回答