Scala隐式函数、隐式方法以及隐式类
Scala中提供了隐式转换和隐式参数等独特的功能,这些是JAVA中所没有的。它支持手动将某种类型对象转换成其他类型,某些场景下非常有用。Scala隐式转换的核心是隐式转换函数(implicit-conversion-function)。定义隐式转换函数,只需要在编写的程序单元内引入,Scala就会自动调用并根据函数签名,在运行中涉及到参数类型相关的对象时,自动转换为指定类型。隐式转换函数对名称没有强制要求。一般建议将这类函数命名为“type2type”的形式。隐式转换函数与普通函数在语法上的差别是以implicit开头,并且需要定义函数返回类型。
先写一个空的scala对象,以及其伴生类:
class FunctionDemo
object FunctionDemo {
}
下面我们将开始了解什么是scala中的隐式参数,隐式函数和隐式类
隐式参数
class FunctionDemo
object FunctionDemo {
//隐式参数
implicit var d=4
def fun(a:Int)(b:Int)(c:Int)(implicit d:Int):Int={
a+b+c+d
}
println(fun(1)(2)(3))//结果为:10
}
这里可以看到:在调用fun函数时,只输入了前三个参数,最后一个参数d是自动调用前面定义的
implicit var d=4
这就是隐式参数。
隐式函数和隐式类
重新定义一个新的对象:
object ImplicitCase {
//隐式参数
implicit var d=4
//隐式方法
implicit def doubleToInt(a:Double)=a.toInt
implicit def doubleToString(a:Double)=a.toString
//隐式类
implicit class getJi(obj:FunctionDemo){
//隐式函数
def ji(n1:Int,n2:Int):Int={
n1*n2
}
}
}
以上是定义在ImplicitCase类中的一些隐式方法和一个隐式类,把前面的一个隐式参数也放到这个类里,然后使用import导入
import ImplicitCase._
class FunctionDemo
object FunctionDemo {
def main(args: Array[String]): Unit = {
import kb11.ImplicitCase._
def fun(a:Int)(b:Int)(c:Int)(implicit d:Int):Int={
a+b+c+d
}
println(fun(1)(2)(3)) //结果为:10
val a:Int=3.444 //调用ImplicitCase中的隐式方法使Double转为Int
println(a) //结果为:3
val b:String=4.5555 //调用ImplicitCase中的隐式方法使Double转为String
println(b) //结果为:4.5555
val fd=new FunctionDemo //创建FunctionDemo类
val num=fd.ji(4,5) //调用ImplicitCase中的隐式类的ji方法
println(num) //结果为:20
}
}