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

隐式参数:
隐式参数是级别在中间的一种参数形式。在调用时可以写也可以不写。在有隐式参数的方法中,调用此方法,那么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"))
}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值