scala隐式参数、隐式函数、隐式类详解

it2026-01-13  6

scala关键字"implicit"详解

隐式参数定义示例 隐式函数定义示例类型转换类型增强 隐式类定义示例

隐式参数

定义

1、定义一个普通变量,使用 implicit 关键字修饰,定义一个函数调用这个变量当参数时,此时这个参数就被称为隐式参数 2、隐式参数的作用:减少提供函数参数的数量,让某些参数拥有隐藏的值(隐式变量)

示例

def main(args: Array[String]): Unit = { //隐式参数(每种类型只能有一个) implicit var a:Int = 10 implicit var str:String = "hello" def fun(a:Int,b:Int)(implicit c:Int=5):Int={ a+b+c } def fun2(a:Int,b:Int)(c:Int):Int={ a+b+c } def fun3(a:Int,b:Int)(implicit c:Int=5,str:String):Int={ println(str) a+b+c } //优先级:传参 > 隐式参数 > 默认 println("fun结果:"+fun(10,10)) //30 调用隐式参数10 //25 默认赋值5 println("fun结果:"+fun(10,10)(20)) //40 传参20 println("fun2结果:"+fun2(10,10)(20)) println("fun3结果:"+fun3(10,10)) println("fun3结果:"+fun3(10,10)(20,"heheda")) }

注:

1、这里定义的变量名是 a,但是传入到函数当中,隐式参数名可以不为 a,随便起什么名字都可以,只要是 Int 类型就可以2、在一个类中,定义同一类型的隐式参数只能有一个,即函数参数列表中同一类型的隐式参数也只能为一个,多了会打架,比如定义了两个Int类型的变量当参数,implicit val a:Int = 10, implicit val b:Int = 20 ,传入到函数中scala编译就不知道用哪个参数了3、在一个类中,不同类型的隐式参数可以传入到函数当中4、scala中函数的传参级别: 函数列表传参 > 隐式参数 > 默认值

隐式函数

定义

1、隐式函数也称隐式转换,使用implicit修饰的函数 2、作用:可以通过一个隐式函数将一种类型转变为另一种类型

3、隐式转换有两种应用场景:

a)类型转换,隐式转换为期望类型b)类型增强

示例

类型转换

在scala中定义一个隐式函数,函数体是将传入的 Double 类型使用 toInt 方法转为 Int 类型

def main(args: Array[String]): Unit = { //隐式函数 //类型转换:Double --> Int implicit def DoubleToInt(a: Double) = {a.toInt} //定义隐式函数 val x: Int = 3.5 //写的时候scala就调用了隐式函数 doubleToInt 进行类型转化 println(x) }

常用的类型转换:

implicit def doubleToString (obj:Double):String=obj.toString implicit def intToString(obj:Int):String=obj.toString implicit def stringToInt(obj:String):Int=Integer.parseInt(obj)

类型增强

定义一个隐式函数,使 “true=1,false=0” ,此时便可提供一个隐式函数,使得Int+Boolean成立

def main(args: Array[String]): Unit = { //隐式函数 //类型增强 implicit def BooleanToInt(x:Boolean) = if(x) 1 else 0 println(1+true) println(1+false) }

注: 隐式转换的发生时机

1、当方法中的参数的类型与目标类型不一致时2、当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换

隐式类

定义

1、隐式类指的是用implicit关键字修饰的类。 2、在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。

示例

package nj.zb.kb09.implicitdemo class Demo2{ } object Demo2 { def main(args: Array[String]): Unit = { //导包 import nj.zb.kb09.implicitdemo.Impliciteg2._ val demo2 = new Demo2 demo2.aa("abc") println(demo2.add(12, 12)) println(demo2.bb(3)) println(demo2.login("zs", "123")) } }

package nj.zb.kb09.implicitdemo object Impliciteg2 { implicit class Demo2Implicit(demo2:Demo2) { def aa(s: String): Unit = { println(s) } def bb(num: Int):String = { if (num % 2 == 0) "偶数"else "奇数" } def add(num1: Int, num2: Int): Int = { num1 + num2 } } implicit class Demo2Implicit2(demo2:Demo2){ def login(name:String,pwd:String):Boolean={ if (name.equals("zs") && pwd.equals("123")) true else false } } }

参考博客:https://blog.csdn.net/and52696686/article/details/107618593

最新回复(0)