Scala隐式转换例子

package com.liao.day05

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

import scala.io.Source

class RichFile(file:File){
  //定义方法返回文件的行数
  def count():Int={

    val fileReader=new FileReader(file)
    val bufferedReader = new BufferedReader(fileReader)

    var line_num=0

    var line=bufferedReader.readLine()
    while (line!=null){//循环读取行数
      line_num+=1
      line=bufferedReader.readLine()
    }

    bufferedReader.close()//关闭流
    fileReader.close()//关闭流

    line_num//返回行数
  }
}

object ScalaImplicit {

  def say(implicit content:String):Unit={println(content)}

  def add(a:Int)(implicit b:Int):Int={a+b}

  def addPlus(a:Int)(implicit b:Int,c:Int):Int={a+b+c}

  implicit def double2Int(d:Double):Int={
    println("调用了double2Int方法")
    d.toInt
  }//方法

  implicit val doubleTwoInt=(d:Double)=>{
    println("调用了doubleTwoInt函数")
    d.toInt
  }//函数

  implicit class RichFileRead(file: File){
    def read()={
      Source.fromFile(file).mkString
    }
  }

  def main(args: Array[String]): Unit = {
    implicit val msg1="morning"
//    implicit val msg2="hello"    如果有多个隐式转换参数就会报错,不知道找哪个
    say(msg1)
    say//若say方法里的参数没有加implicit关键字就会报错

    implicit val numB:Int=23
    println(add(5))
    println(addPlus(5))

    println("------------------隐式转换类型---------------------")
    //上面有定义一个implicit的double2Int方法和,找到自动转换,优先寻找函数,因为Scala是函数式编程
    var age:Int=20.6

    println("------------------隐式类---------------------")
    val file = new File("H:\\东软大数据实训\\11.大数据客服项目\\3.代码\\ct180808.sql")
    //因为file直接点没有统计行数的方法,我们来扩展一下它的功能,在object外上面写一个普通RichFile类,然后使用隐式转换方法转换类
    println(new RichFile(file).count())//这样调用用户体验不好,我们去上面定义一个file2RichFile自动转换方法
    import MyImplicit.file2RichFile
    println(file.count())//使用了一个隐式方法隐式地将file转换了RichFile类,可以直接使用count方法                                这个是类通过方法转为另一个类
    //如果我们定义了大量的隐式转换方法会很难找,我们新建一个MyImplicit类专门存放转换方法
    //把  implicit def file2RichFile(file:File)=new RichFile(file)//定义了一个隐式转换类的方法,把file转为RichFile类
    //复制到里面去

    println(file.read())//我们定义了一个隐式转换类,里面有read方法,这个是类转类

  }//main方法里

}//object结束
import java.io.File

object MyImplicit {

  implicit def file2RichFile(file:File)=new RichFile(file)//定义了一个隐式转换类的方法,把file转为RichFile类
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值