我刚刚遇到有关更改API的真正问题。我想更多地了解这个话题。 使用以下示例作为演示。
有4个简单的类,Child类扩展Parent。 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());
}
}
前三个类是由API制造商提供的,假设上面的版本是版本1.
在版本2中,PubAPI类更改为返回子类型:
public class PubAPI
{
public Child getChild(){
return new Child();
}
}
3 API提供程序类现在位于versoin 2中,而如果我们不重新编译“Client”类并使用其版本1生成的类文件。 IT将在java运行时失败,错误无法找到版本1方法(因为返回类型更改)。
我之前不知道这个,我想知道是否有人知道更多关于这个话题,例如,如果公共API添加一个throw,或添加一个同步或类成为final,等等。在这些情况下,他将如何呢。
总之,其他人使用的API类的公共API /类字节码级别可比性规则是什么。
感谢。
答案 0 :(得分:2)
您使用关键字字节码级别兼容性走在正确的轨道上。它被称为二进制兼容性,您可以在网上查找。例如,here
这些规则起初并不总是易于理解,但通常在您收到错误并考虑它们时才有意义。最好的办法是尝试你列出的个案,当你在JLS中得到一个不兼容的错误确认,然后尝试合理化为什么会这样。
This这样的问题似乎在讨论完全相同的问题。 document at eclipse它的网站比JLS更容易阅读。