定义:
1.只要在程序可见的范围内定义了隐式转换函数,就会被scala自动调用
2.隐式转换函数的名字可以任意,建议名为”xxx2yyy”
3.以implicit开头,而且最好定义函数返回类型
eg:
object Test{
def main(args:Array[String]): Unit ={
class Student(val name: String)
class Older(val name: String)
class SpecialPerson(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 null
}
var ticketNumber = 0
def buySpecialTicket(p: SpecialPerson) = {
ticketNumber += 1
"T-" + ticketNumber
}
val a=new Student("aaa")
println(buySpecialTicket(a))
val b=new Older("bbb")
println(buySpecialTicket(b))
}
}
** 隐式转换的强大之处就是可以在不知不觉中增强现有类的功能
** 如果隐式转换函数不在可见范围内,那就必须使用import来导入,如:importxxx._
class Man(val name: String)
class Superman(val name: String) {
def emitLaser = println("emit a laster!")
}
implicit def man2superman(man: Man): Superman = new Superman(man.name)
val leo = new Man("leo")
leo.emitLaser
** Scala什么时候会进行隐式转换?
1 调用某个函数,但传入参数的类型与函数定义的参数类型不匹配(函数)
2 调用某个方法,虽然该类有这个方法,但给方法传入的参数类型,与方法定义的参数类型不匹配(方法)
3 使用某个对象,调用某个方法,但这个方法并不存在于该类时
—-隐式参数———————
** 在函数或方法中,用implicit来修饰的参数即为隐式参数
** Scala会尝试找到一个对应类型的、用implicit修饰的对象,即隐式值,并将其作为参数注入
** Scala会在两个范围内查找:一个是当前作用域内可见的val或var定义的隐式变量
** 另一个是隐式参数类型的伴生对象内的隐式值
class SignPen {
def write(content: String) = println(content)
}
implicit val pen = new SignPen
def signForExam(name: String) (implicit signPen: SignPen) {
signPen.write(name + " come to exam in time.")
}
signForExam("aaa")