我很难理解teh类型类模式和Scala中隐式类之间的用例差异。让我感到困惑的是,他们都在Scala中提供了临时的民族主义。
我的问题是。他们是在解决相同的问题,还是在用例方面存在明显差异?
答案 0 :(得分:11)
有区别。
隐式类通常用于为现有类型提供扩展方法:
implicit class IntExt(val x: Int) extends AnyVal {
def squared: Int = x * x
}
10.squared shouldEqual 1000
它们实际上并不提供ad-hoc多态性;它只是一种在现有类型上定义新方法的能力。
另一方面,类型类依赖于另一种隐式机制(在隐式类的情况下隐式转换与隐式转换),它们是ad-hoc多态的机制:
trait Show[T] {
def show(x: T): String
}
implicit val intHexShow: Show[Int] = new Show[Int] {
override def show(x: Int): String = Integer.toHexString(x)
}
implicit val stringReverseShow: Show[String] = new Show[String] {
override def show(x: String): String = x.reverse
}
def showPrint[T](value: T)(implicit s: Show[T]): Unit = {
println(s.show(value))
}
showPrint(12) // prints "c"
showPrint("hello") // prints "olleh"
由于具有相应隐式参数的函数接受在特定类型的类型类实现中定义的“行为”作为参数,因此确实是ad-hoc多态的情况。类型类用于Scala中的许多东西:JSON编码/解码,函数结构,如monad和applicatives,类型多态函数,仅举几例。当您需要以通用方式向现有类型添加新行为时,几乎无处不在,您将遇到类型类。