为了巩固自己使用implicit的概念,我写了一个例子,不需要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 好,它基本上会为你做所有这些。但是,这就是权衡所在。