Scala编程(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.11 方法重载

回到Rational类。有了最新的这些变更以后,就可以用更自然的风格来对有理数进行加法和乘法运算。不过我们还缺少混合运算。比如,不能用一个有理数乘以一个整数,因为*的操作元必须都是Rational对象。因此对于一个有理数r,不能写成r * 2,而必须写成r * new Rational(2),这并不是理想的效果。

为了让Rational类用起来更方便,我们将添加两个新的方法来对有理数和整数进行加法和乘法运算。同时,我们还会顺便加上减法和除法运算。调整后的结果请看示例6.5。

现在每个算术方法都有两个版本:一个接收有理数作为参数;另一个则接收整数作为参数。换句话说,每个方法名都被重载了,因为每个方法名都被用于多个方法。举例来说,+这个方法名被同时用于一个接收Rational参数的方法和另一个接收Int参数的方法。在处理方法调用时,编译器会选取重载方法中正确匹配了入参类型的版本。例如,如果x.+(y)中的y是有理数,编译器就会选择接收Rational参数的+方法。但如果入参是整数,编译器就会选择接收Int参数的那个方法。如果你尝试下面这段代码:

示例6.5 带有重载方法的Rational

你将会看到,被调用的*方法具体是哪一个取决于右操作元的类型。

注意

Scala解析重载方法的过程与Java很像。在每个具体的案例中,被选中的是那个最匹配入参静态类型的重载版本。有时候并没有一个唯一的最佳匹配版本,遇到这种情况编译器会提示“ambiguous reference”(模糊引用)错误。