Scala学习--详解隐式转换与隐式参数

Scala提供的隐式转换和隐式参数是非常有特色的功能,它允许你手动指定,将某种类型的对象转换成其他类型的对象。

Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用,Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回。

隐式转换函数叫什么名字是无所谓的,因为通常不会由用户手动调用,而是由Scala调用,但是如果要使用隐式转换,则需要对隐式转换函数进行导入,因此通常建议将隐式转换函数的名称命名为”one2one“的形式。

隐式转换

//隐式转换函数与普通函数唯一的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。

案例:特殊售票窗口(只接受特殊人群,比如学生,老人等)

class SpecialPerson(val name:Strring)
class Student(val name:String)
class Older(val name:String)

implicit def object2SpecialPerson(obj:Object):SpecialPerson = {
	if(obj.getClass == classOf[Student]) {val stu = obj.asInstanceOf[Student];new SpecialPerson(stu.name)}
	else if(obj.getClass == classOf[Older]) {val older = obj.asInstanceOf[Older];new SpecialPerson(older.name)}
	else Nil
}

var ticketNumber = 0
def buySpecialTicket(p:SpecialPerson) = {
	ticketNumber += 1
	"T-" + ticketNumber
}

调用:
val xiaoming = new Student("xiaoming")
buySpecialTicket(xiaomign)

使用隐式转换加强现有类型

//隐式转换非常强大的一个功能,就是可以在不知不觉中加强现有类型的功能。也就是说,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由Scala自动进行隐式转换为加强类,然后再调用该方法。

案例:超人变身

class Man(val name:String)
class Superman(val name:String){
	def emitLaser = println("emit a laser")
}

implicit def man2superman(man:Man):Superman = new Superman(man.name)

val xiaoming = new Man("xiaoming")
xiaoming.emitLaser

隐式转换的发生时机

//调用某个函数,但是给函数传入的参数的类型,与函数定义的接收参数类型不匹配,例如案例:特殊的售票窗口
//使用某个类型的对象,调用某个方法,而这个方法并不存在与该类型时(案例:超人变身)
//使用某个类型的对象,调用某个方法,虽然该类型有这个方法,但是给方法传入的参数类型,与方法定义的接收参数的类型不匹配。

隐式参数

//隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数。
//Scala会在两个范围内查找,一种是当前作用域内可见的val或var定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值。

案例:考试签到

class SignPen{
	def write(content:String) = println(content)
}
implicit val signPen = new SignPen

def signForExam(name:String)(implicit signPen:SignPen){
	signPen.write(name + "come to exam in time")
}

调用:
signForExam("xiaoming")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值