假设我们有一个Base
类,其中包含Object
参数的方法,并且在较新的版本中,开发人员决定将Ojbect
更改为int
。
例如:
public class Base {
public void foo(Object i)
{
System.out.println("ahahaa");
}
}
public class Child extends Base
{
public void foo(Object i)
{
System.out.println("tru-la-la");
}
}
然后新版Base:
public class Base
{
public void foo(int i)
{
Console.WriteLine("ahahaa");
}
}
然后,如果我们称之为:
Child child = new Child();
child.foo(5);
我们会得到“ahaha”而不是预期的“tru-la-la”
那么我们如何处理它,以及我们应该使用哪种架构解决方案?
答案 0 :(得分:2)
好像你没有找到关于你为什么得到的解释" ahaha"而不是" tru-la-la" (您在Base类中更改之前获得的)。
如果要发布要供其他开发人员使用的库,则需要保持向后兼容性。您在Base类中描述的chnage显然不尊重向后兼容性,因此任何依赖它的代码都会破坏。
除了更改代码或停止使用该库之外,您无能为力。
您可以更改代码,例如,通过调用child.foo(new Integer(5))
来调用子类方法。
另一件可以帮助的事情是使用@Override
注释标记Child类中的方法。这将阻止您的代码在Base类更改后进行编译。
答案 1 :(得分:0)
如果你使用的是int -child.foo(5);那么JVM将自然地采用最具体的子对象中的方法。在这种情况下它是
之间的选择public void foo(Object i){
&安培;
public void foo(int i){
更具体的是 -
public void foo(int i){ 写“ahahaa”