上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.12 隐式转换
现在你已经可以写r * 2,你可能还想交换两个操作元的位置,即2 * r。很不幸,这样还不行:
这里的问题是2 * r等价于2.*(r),因此这是一个对2这个整数的方法调用。但Int类并没有一个接收Rational参数的乘法方法—它没法有这样一个方法,因为Rational类并不是Scala类库中的标准类。
不过,Scala有另外一种方式来解决这个问题:可以创建一个隐式转换(implicit conversion),在需要时自动将整数转换成有理数。可以往解释器里添加行:
这将会定义一个从Int到Rational的转换方法。在方法名前面的implicit修饰符告诉编译器,可以在某些场合自动应用这个转换。有了这个定义,你就可以重新尝试之前失败的示例:
为了让隐式转换能工作,它需要在作用域内。如果你将隐式方法的定义放在Rational类内部,对解释器而言它是没有在作用域的。就目前而言,你需要在解释器中直接定义这个转换。
就像从示例中看到的,隐式转换是让类库变得更灵活、更便于使用的强大技巧。由于它们非常强力,也很容易被滥用。你会在第21章找到更多关于隐式转换的细节,包括如何在需要时将它们引入到作用域内。