隐式转换增强现有类型
import scala.io.Source //RichFile相当于File增强类,需要将被增强的类作为参数传入增强类构造器中 class RichFile(filePath :String){ def read():String = { Source.fromFile(filePath).mkString } } //implicit定义一个隐式转换函数把被增强类型转换成增强的类型 object MyPredef{ //File --> RichFile implicit val filePath2File = (filePath:String) => new RichFile(filePath) } object HelloImplicitConversions { def main(args: Array[String]): Unit = { val filePath = "c://cc//cc.txt" //导入隐式转换 import MyPredef._ //String类本身没有read(),隐式转换为RichFile类调用的read() filePath.read } }有时候进行代码重构,要增强他的某项功能同时又不想做太大的改动
import scala.io.Source object Context_helper{ implicit class FilePath2File(filePath:String){ def read:String = Source.fromFile(filePath).mkString } implicit class OpAdd(x:Int){ def add(y:Int):Int = x + y } } object ImplicitsClass { def main(args: Array[String]): Unit = { import Context_helper._ val fn = "d://myFile//ff.md" println(fn.read) println(1.add(2)) } }也可以用来做参数类型转换
implicit def object2SpecialPerson(obj : Object) : SpecialPerson = { obj match{ case a : Student => {val stu = obj.asInstanceOf[Student];new SpecialPerson(stu.name)} case b : Older =>{val old = obj.asInstanceOf[Older];new SpecialPerson(old.name)} case _ => Nil } }在每次上下文运行的实例对象中将具体的值注入到隐式参数中,而且注入的过程是自动的
//[T: Ordering]:说明存在一个隐式类型Ordering[T] class Pair_Implicits[T: Ordering](val a: T, val b: T){ //声明一个隐式类型对象传入函数 def bigger(implicit ordered: Ordering[T]) = { if (ordered.compare(a, b) > 0) a else b } } object ContextBoundsInternals { def main(args: Array[String]): Unit = { new Pair_Implicits(1, 2).bigger } }