给出以下代码:
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
那里协调他们的结果。
TaskA
未调用签名的原因是因为TopWorker.work
保证仅Task
传递a而不传递TaskA
实例。SubWorkerA.work(Task task)
最终被调用,因为它是唯一在参数中work
输入type的方法Task
。如果您改为调用this.subWorkerA.work((TaskA)task)
,则所需的方法将被调用,尽管这本质上是不安全的。
我认为您可能将方法重载与后期绑定混淆了。重载只是允许您以相同的方式命名方法,只要它们具有不同数量的参数或参数类型即可。调用重载方法时,将根据参数的组成选择正确的方法。在后期绑定中,您通过在子类中复制其签名来覆盖方法,即使您将其父对象引用为超类的实例,也将强制调用该覆盖方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句