Java多态性/重载惊喜

克里斯·迈耶(Chris Meyer)

给出以下代码:

class Task{};
class TaskA extends Task{};

class TopWorker{
  //... omitting constructor, instance variables, etc.
  public void work(Task task){
    this.subWorkerA.work(task)
    //followed by more subworkers...
  }
}

class SubWorkerA{
  public void work(TaskA task){
    // Subworker A does something interesting here
  }
  public void work(Task task){
    // Subworker A doesn't care, do nothing
  }
}

TaskA task = new TaskA();
(new TopWorker).work(task);

我希望它的TaskA签名work()Task被调用,而不是版本被调用。我认为问题是TopWorker仅接受一个Task,因此java必须进行相应的调度SubWorker.work()

有什么办法可以解决这个问题?假设我有很多Tasks工人,并且在TopWorker那里协调他们的结果。

CodeBlind

TaskA未调用签名的原因是因为TopWorker.work保证仅Task传递a而不传递TaskA实例。SubWorkerA.work(Task task)最终被调用,因为它是唯一在参数中work输入type的方法Task如果您改为调用this.subWorkerA.work((TaskA)task),则所需的方法将被调用,尽管这本质上是不安全的。

我认为您可能将方法重载与后期绑定混淆了。重载只是允许您以相同的方式命名方法,只要它们具有不同数量的参数或参数类型即可。调用重载方法时,将根据参数的组成选择正确的方法。在后期绑定中,您通过在子类中复制其签名来覆盖方法,即使您将其父对象引用为超类的实例,也将强制调用该覆盖方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章