32
A
回答
49
方法重载在编译时解决。
多次调度在运行时解析。
使用双分派时,被调用的方法取决于接收方和参数的实际类型。然而,方法重载只允许被调用的方法依赖于声明的参数类型。为什么? Java在编译时将它们的全部签名绑定到方法调用(早期绑定)。完整的签名包括所有的参数类型,因此当参数的实际类型在运行时(polymoprhism)有所不同时,重载不能像你期望的那样工作!
void add(Foo o) { ... }
void add(Bar o) { ... }
void client() {
Foo o = new Bar();
add(o); // calls add(Foo) not add(Bar)!
}
使用多分派然而
void add(Foo o) { o.dispatch(this); }
void add(Bar o) { o.dispatch(this); }
void client() {
Foo o = new Bar();
add(o); // calls #dispatch as defined in Bar!
}
事情可能在Scala中略有不同,但一般的区别应该是一样的在这里所有的编程语言呈现。
相关问题
- 1. bootstrap方法和run方法在角度上有什么区别?
- 2. 算法和方法有什么区别
- 3. GET和POST方法有什么区别?
- 4. UrlHelper.Route和UrlHelper.Link方法有什么区别?
- 5. 方法和协议有什么区别
- 6. 方法`toHaveBeenCalled()`和`andCalledThrough()`有什么区别?
- 7. nibNameOrNil和ViewDidLoad方法有什么区别?
- 8. browser.sleep()和browser.wait()方法有什么区别?
- 9. 精度和刻度有什么区别?
- 10. 长度和长度()有什么区别?
- 11. 在Java中重载和多次调度
- 12. 方法覆盖和功能覆盖/超载有什么区别
- 13. 消息传递和方法调用有什么区别?
- 14. 调用javascript方法的两种方法有什么区别
- 15. pm2重新启动和pm2重新加载有什么区别
- 16. 强制和超载有什么区别?
- 17. 静态方法和非静态方法有什么区别?
- 18. UITableView方法和等效的UITableViewDatasource方法有什么区别?
- 19. 本练习中substr方法和slice方法有什么区别?
- 20. Python中的string方法和str方法有什么区别?
- 21. 调试和编译有什么区别?
- 22. 调用exampleFunction()和exampleFunction.call()有什么区别?
- 23. 绑定和调用有什么区别?
- 24. 这两种方法有什么区别
- 25. url_for方法有什么区别?
- 26. 各种HTTP方法有什么区别?
- 27. 这些np.linalg.norm方法有什么区别
- 28. 多租户和多用户解决方案有什么区别?
- 29. 调度程序的standby()和pauseAll()有什么区别?
- 30. Windows任务调度器和hangfire(或Quartz.net)有什么区别?
感谢您的好例子。 – shj 2013-12-10 21:53:20