scala中的implicit
一:用于参数(Implicit parameters)
函数中的最后一个参数可以被implicit标记;当函数被调用时,被implicit标记的值会从该函数被调用的地方的上下文中自动寻找,并自动装配。如果没有找到相应类型的也被implicit修饰是值,在编译时会报错。
example:
// probably in a library
class Prefixer(val prefix: String)
def addPrefix(s: String)(implicit p: Prefixer) = p.prefix + s
// then probably in your application
implicit val myImplicitPrefixer = new Prefixer("***")
addPrefix("abc") // returns "***abc"
二:隐式转换(Implicit conversions)
当一个表达式上下文中要求A类型的变量,但是在表达式中,该变量是B类型
编译器会在表达式上下文(比如类A或类B中伴生对象中定义的函数)中寻找B => A类型的隐式值(implicit value),用于将表达式中B类型变量自动转换为A类型变量。所以,对于没有加implicit类型的函数来说,编译器会自动将加了implicit的函数用于类型转换。
example:
implicit def doubleToInt(d: Double) = d.toInt
val x: Int = 42.0
和
def doubleToInt(d: Double) = d.toInt
val x: Int = doubleToInt(42.0)
的效果是一样的。