隐式转换在scala中具有强大的魔力,能够让本就精简的代码变得更加简洁。但是强大同样意味这难以掌握,刚好我在学习scala的过程中接触到了这种神奇的语言特性,于是不自量力的说说自己的理解。
无论任何语言特性,复杂的或者简单的,它出现的目的必定是为了解决某些其他语言难以解决或者解决起来十分麻烦的问题。所以为了了解隐式转换,同样我们需要知道它可以解决哪些问题。从一个简单的例子出发。比如我们现在有一个自定义的数字类。然后我们在其中定义了加法。代码类似下图:
可以看到自定义的数字类中有两个重载的方法用来计算加法。看起来似乎是没有问题,但是如果上图中val c = a + b 变成 val c = b + a就会编译失败。因为在Int类中并不存在重载后参数为自定义数字类的加法。所以这个时候我们就需要将a转换类型为自定义数字类这样就能用自定义数字类中的方法来完成计算。当然如果手动来完成这样的操作,看起来实在太繁琐,不符合简洁的风格。同时也会将自己的实现暴露给调用者。于是此时我们就可以用隐式转换来完成这个操作。
如图中所示,不仅可以将Int类型隐式转换为Demo3类型,同时也可以将Double类型,自定义的Demo4类型隐式转换成Demo3类型然后完成计算。
当然除了隐式方法以外,还有隐式类和隐式参数。比如下面这段代码