为了巩固我对“隐式”的概念,我写了一个例子,不需要scala 2.8,但是使用了相同的概念。我认为这可能会对某些人有所帮助。
首先,您定义一个通用抽象类
Addable :
scala> abstract class Addable[T]{
| def +(x: T, y: T): T
| }
defined class Addable
现在您可以像这样编写
add函数:
scala> def add[T](x: T, y: T)(implicit addy: Addable[T]): T =
| addy.+(x, y)
add: [T](T,T)(implicit Addable[T])T
这类似于Haskell中的类型类。然后,要将此通用类实现为特定类型,您需要编写以下内容(这里是Int、Double和String的示例):
scala> implicit object IntAddable extends Addable[Int]{
| def +(x: Int, y: Int): Int = x + y
| }
defined module IntAddable
scala> implicit object DoubleAddable extends Addable[Double]{
| def +(x: Double, y: Double): Double = x + y
| }
defined module DoubleAddable
scala> implicit object StringAddable extends Addable[String]{
| def +(x: String, y: String): String = x concat y
| }
defined module StringAddable
此时,您可以使用所有三种类型调用add函数:
scala> add(1,2)
res0: Int = 3
scala> add(1.0, 2.0)
res1: Double = 3.0
scala> add("abc", "def")
res2: java.lang.String = abcdef
当然不如 Haskell 那么好,因为 Haskell 基本上可以为你完成所有这些。但是,这就是权衡的地方。