在重构方法时,很容易在Java中引入二进制不可编码(使用以前版本的代码)。
考虑更改方法以将其参数的类型扩展为父接口:
void doSomething(String x);
// change it to
void doSomething(CharSequence c);
使用此方法的所有代码将继续编译而不进行更改,但它确实需要重新编译(因为旧的二进制文件将因MethodNotFoundError而失败)。
如何将方法拉入父类。这需要重新编译吗?
// before
public class B extends A{
protected void x(){};
}
// after
public class A {
public void x(){};
}
public class B extends A{}
该方法已从B移至父A。它还将可见性从受保护更改为公共(但这不是问题)。
我是否需要在B中维护“二进制兼容性包装器”,还是继续工作(自动发送到父类)?
// do I need this ?
public class B extends A{
// binary compatibility wrapper
public void x(){ super.x(); }
}
答案 0 :(得分:13)
“扩展”会影响方法的签名,因此不是二进制兼容的。将方法移动到超类不会影响方法签名,因此它将起作用。 Eclipse有一个描述API和ABI兼容性的优秀文档:
http://wiki.eclipse.org/Evolving_Java-based_APIs
第2部分中有更明确的规则:
http://wiki.eclipse.org/Evolving_Java-based_APIs_2
我相信你对“改变形式参数的类型”(即你所谓的扩展)或“移动API方法向上类型层次结构”(即你所谓的拉入父类)感兴趣)。
答案 1 :(得分:-1)
它应该继续自动工作,因为Java具有动态链接