2009-11-26 62 views

回答

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中略有不同,但一般的区别应该是一样的在这里所有的编程语言呈现。

+0

感谢您的好例子。 – shj 2013-12-10 21:53:20

相关问题