为什么调用最低基类的方法而不是顶层?

时间:2015-10-12 14:30:15

标签: java

我有像

这样的代码
for(Object obj : list)
    func(obj);

void func(Object o){}
void func(Derived d){}

如果objDerived,则会调用func(Object)而不是func(Derived)。任何人都可以告诉我如何调用func(Derived)吗?感谢

3 个答案:

答案 0 :(得分:1)

对于方法参数,选择的重载取决于对象的编译时类型(在本例中为Object)。

一种解决方案是使func成为实例方法,并在Derived中覆盖它。

然后你可以做

for (Base base : list)
    base.func();

如果您不能这样做(例如,因为这些不是您的课程),您必须使用instanceof支票

for (Object o : list)
    if (o instanceof Derived)
        func((Derived) o);
    else
        func(o);

首选方法。

答案 1 :(得分:0)

检查对象是否为派生而不是施放他。 像

这样的东西
for(Object obj : list){
    if(obj instanceof Derived){
        func((Derived) obj);
    } else {
        func(obj);
    }
}

答案 2 :(得分:0)

快速而肮脏的解决方案

for (Object obj: list) {
  if (obj instanceof Derived) {
     func((Derived) obj);
  } else {
      func(obj);
  }
}

但是这种使用instanceof通常是代码气味,你的代码可能需要一个重构来使用多态。我的意思是使用Ancestor方法创建func()类,并从祖先扩展Derived,然后使用Ancestor作为循环变量类型:for (Ancestor obj: list) obj.func();但可能是你需要做进一步的改进。