implicit conversions
- 类型转换
scala中的implicit是指可以自动转换的值,或者是从一种类型到另一种类型的自动转 换。下面是官网给的一个简单的例子:
"abc".map(_.toInt)
本身String是不支持map方法的,但是StringOps 支持,此处字符串其实调用的就 StringOps 的map方法。String到StringOps的隐式转换定义在Predef对象下面@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
scala中许多隐式转换都定义在了该对象中。
栗子
class ClassA
class ClassB(p: ClassA) {
def method = println("I am ClassB")
}
object ImplicitTest {
def main(args: Array[String]): Unit = {
import Transform.aToB
new ClassA().method //ClassA没有method方法,会自动在作用域内寻找匹配的转换类型,通常将隐式转换定义在伴生对象中,因为其对所有对象都是可见的
}
}
object Transform {
implicit def aToB(p: ClassA): ClassB = new ClassB(p) //此处提供了ClassA到ClassB的自动转换
}
-当A需要method这个方法的实现,而你又不想破坏A类原本的结构,就可以给其提供到B的隐式转换。注意:1.B类的构造器必须接收A类的对象作为参数。2.需要import隐式转换。3.隐式转换必须定义在object 对象里面
- 参数的隐式转换
object ImplicitTest {
def main(args: Array[String]): Unit = {
import Transform.x
method //method方法参数声明为implicit,编译器会在作用域内寻找能够匹配的参数值
}
def method(implicit x: String) = println(x)
}
object Transform{
implicit val x: String = "你真2"
}
-函数的隐式转换
object ImplicitTest {
def main(args: Array[String]): Unit = {
import Transform.implicitFun
method(10) //编译器会在作用域内寻找能够匹配的函数
}
def method(x: Int)(implicit f: Int => Unit): Unit ={
f(x)
}
}
object Transform{
implicit def implicitFun(x: Int): Unit = println(x) //提供了 Int => Unit 类型函数的隐式转换
}
-其实上面两种implicit没什么区别,函数式编程的核心思想就是一切皆对象,也就是说函数其实也是一个对象,这种思想其实在scala里面随处可见(个人见解)
-隐式类
object ImplicitTest {
def main(args: Array[String]): Unit = {
import Transform.MyImplicit
2.method
}
object Transform {
implicit class MyImplicit(p: Double){ // 接收Double参数 ,提供Double类到该类的隐式转换
def method = println("I am MyImplicit")
}
}
就到这儿吧!!