隐式详解

调用别人的框架的时候,少了一些方法,需要添加,让别人为你添加不现实

scala> implicit def doubleInt(d : Double) = d.toInt
scala> val a : Int = 3.14
a: Int = 3

隐式参数

def say(implicit content : String) = println(content)

def main(args: Array[String]): Unit = {
  implicit val cont = "你真帅"
    // implicit val cont3 = "你真帅"  隐式参数的时候不能出现歧义
  say
}

say的方式定义的参数是隐式参数,没有传递参数的情况下,编译器会在编译时自动从当前上下文中找一个隐式值(符合参数类型的隐式值)

注意 方法参数如果有多个隐式参数,只需要使用一个implicit关键字即可,隐式参数列表必须放在方法的参数列表后面

隐式类型

package threeDay

import java.io.{BufferedReader, File, FileReader}


object TestImplicit {

  class RichFile(file: File) {
    def count(): Int = {
      //返回文件的记录行数
      val fileReader = new FileReader(file)
      val bufferedReader = new BufferedReader(fileReader)

      var sum = 0
      try {
        var line = bufferedReader.readLine()
        while (line != null) {
          sum += 1
          line = bufferedReader.readLine()
        }
      } catch {
        case _: Exception => sum
      } finally {
        fileReader.close()
        bufferedReader.close()
      }
      sum
    }
  }

  implicit def file2RichFile(file: File) = new RichFile(file)

  def main(args: Array[String]): Unit = {
    val file = new File("")
    file.count()
  }
}

注意 必须放在Object中

可以放在其他类里,用导包的方式引入

object MyIm {
  implicit def file2RichFile(file: File) = new RichFile(file)
}
import java.io.{BufferedReader, File, FileReader}
object TestImplicit {
  class RichFile(file: File) {
    def count(): Int = {
      //返回文件的记录行数
      val fileReader = new FileReader(file)
      val bufferedReader = new BufferedReader(fileReader)

      var sum = 0
      try {
        var line = bufferedReader.readLine()
        while (line != null) {
          sum += 1
          line = bufferedReader.readLine()
        }
      } catch {
        case _: Exception => sum
      } finally {
        fileReader.close()
        bufferedReader.close()
      }
      sum
    }
  }


 
}

implicit class FileRead(file: File){
  def read = Source.fromFile(file).mkString
}
// 主函数中
 def main(args: Array[String]): Unit = {
    val file = new File("")
    file.read
  }