Scala隐式参数、隐式函数和隐式类

it2026-04-04  4

隐式参数: 隐式参数是级别在中间的一种参数形式。在调用时可以写也可以不写。在有隐式参数的方法中,调用此方法,那么JVM虚拟机首先寻找的是传参,再传参没有找到的情况下,才会去寻找隐式参数,如果不巧的是隐式参数也没有,这是JVM还会去寻找参数默认值,如果都没有,则调用时会报错,提示需要传参,要么就去写隐式参数。 实例:

implicit var a : Int = 10 implicit var str : String = "Hello" def fun (a : Int,b : Int) (implicit c : Int = 5) = { a+b+c } def fun3 (a : Int,b : Int) (implicit c : Int = 5,str : String) println(str) a+b+c } //优先级:传参 > 隐式参数 >默认 println("fun结果" + fun(10,10)(20)) //40 println("fun2结果" + fun2(10,10)) println("fun3结果为:" + fun3(10,11)(c = 20,str = "Hehe"))

隐式函数: 和隐式参数差不多,只不多这里将隐式参数换成了隐式函数。隐式函数可以在自己创建了莫各类对象就拥有相应的方法。隐式参数就是不需要new相应的类的对象,就可以拥有它的方法。和隐式参数差不多,只不多这里将隐式参数换成了隐式函数。隐式函数可以在自己创建了莫各类对象就拥有相应的方法。隐式参数就是不需要new相应的类的对象,就可以拥有它的方法。 实例:

implicit def DoubleToInt (a : Double) = { a.toInt } val a1 : Int = 3.99 println(a1)

隐式类: 隐式类一般为实体类服务,可以隐式的为实体类增加方法。在实体类创建对象后自动获得此方法。相当于隐式类为目标类放开了权限,只要目标类创建了对象,该对象就可以调用隐式类中的方法。隐式类必须写在object类中,因为object类相当于java中的静态类,在代码执行前编译,这样才能被找到。一般来说隐式类写在一个包中最好,方便查找,包括隐式函数和隐式参数。 实例1: 创建隐式类

object Impliciteg { implicit val num : Int = 10 //定义隐式参数 implicit val msg : String = "Hello" implicit def stringToInt(value : String) : Int = Integer.parseInt(value) //定义隐式函数 implicit def doubleToInt(value : Double) : Int = value.toInt implicit class NumOperation(demo : Demo1) { //定义隐式类 def ji(a : Int,b : Int) : Int = { a*b } def shang(a : Int,b : Int) : Int = { a/b } def add(a : Int, b : Int) = { a+b } } }

在Demo1类中应用

class Demo1 { def main(args: Array[String]) : Unit = { import nj.zb.kb09.implicitdemo.Impliciteg._ val num : Int = 3.3 val num2 : Int = "1" val dm = new Demo1 var jiResult = dm.ji(2,3) var shangResult = dm.shang(6,3) var addResult = dm.add(3,4) println(jiResult) println(shangResult) println(addResult) } }

实例2: 创建隐式类:

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

在Demo2类中应用

class Demo2 { } object Demo2 { def main(args : Array[String]): Unit = { import nj.zb.kb09.implicitdemo.Impliciteg2._ val demon2 = new Demo2 println(demon2.aa("Aythna")) println(demon2.add(11,12)) println(demon2.bb(3)) println(demon2.login("Aythna","123")) } }

最新回复(0)