隐式转换函数:
object ListDemo{
implicit def int2String(value:Int) = value.toString
def main(args: Array[String]): Unit = {
println( 10.length)
}
}
上面的代码能够正常的执行,并且会输出2. 原因是以为多了一个用implicit修饰的函数,叫做隐式函数。他与正常函数的区别是前面加了一个implicit,他的意义在与如果编译器在编译的时候找不到你所用的类型,那么隐式转换函数会自动将数据转换成你所期望的类型。所以上面的10调用length不合法,但是会自动在当前作用域中寻找隐式函数使其合法。
隐式转换函数的发生在下面的情形:
e是一个S类型的表达式,而需要的却是T类型,编译器会寻找S=>T的隐式转换
e是一个S类型的表达式,使用点号访问e.m时,m不是类型S的成员,编译器会寻找合适的隐式转换使e.m合法
再比如:
class ListDemo(value:Int) {
def sayInt(value1:Int): Unit ={
println(value + value1)
}
}
object ListDemo{
implicit def int2Val(value:Int) = new ListDemo(value)
def main(args: Array[String]): Unit = {
2.sayInt(3)
}
}
编译器会根据隐式转换函数把2转换成ListDemo对象,然后调用sayInt方法进行相加
隐式转换函数目的是由一种参数转为另一种参数,所以隐式转换函数的只能有一个参数
隐式类: 类的前面加implicit,隐式类用来增加类的功能
上面第二个例子中我们可以直接用隐式类来进行转换,看起来更简单,比如:
object ListDemo{
implicit class Demo(value:Int){
def sayInt(value1:Int): Unit ={
println(value + value1)
}
}
def main(args: Array[String]): Unit = {
2.sayInt(3)
}
}
隐式类的定义也是有限制的,比如说构造函数中必须携带一个参数,只能在别的trait/类/对象内部定义等。
隐式参数:
方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。
比如说:
class ListDemo {
def sayInt(implicit value1:Int): Unit ={
println(value1)
}
}
object ListDemo{
implicit var value:Int = 10
def main(args: Array[String]): Unit = {
new ListDemo().sayInt
}
}
上面的sayInt没有传递任何值也不会报错,是因为它自动找到了value:Int = 10,并将其专递 了过去。
隐式转换虽然灵活,但是无疑加大了代码的可读性。
只是学了学 还需多多联系
欢迎关注我的公众号:北风中独行的蜗牛(manong_xiaodong)