scala中的隐式转换和隐式参数

简介: Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定将某种类型的对象转换成其他类型的对象,或是给一个类增加方法。通过这些功能,可以实现非常强大的功能。

简介:

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定将某种类型的对象转换成其他类型的对象,或是给一个类增加方法。通过这些功能,可以实现非常强大的功能。

1、隐式转换

隐式转换其核心就是定义一个使用 implicit 关键字修饰的方法,实现把一个原始类转换成目标类,这样你可以调用目标类中的方法,是不是很强大。隐式转换的方法需要定义在一个object中。

示例一:对第三方库类进行转化,让File类具备RichFile类中的read方法
import java.io.File

import scala.io.Source

object ExecFileDef {
  //定义一个隐式转换的方法,实现把File转换成RichFile
  implicit def file2RichFile(file: File) = new RichFile(file)
}

// 扩展file类
class RichFile(val file: File){
  //读取数据文件的方法
  def read():String={
    Source.fromFile(file).mkString
  }
}

object RichFile{
  def main(args: Array[String]): Unit = {
    //1、构建一个File对象
    val file = new File("F:\\acc.txt")

    //2、手动导入隐式转换
    import ExecFileDef.file2RichFile

    //此时的file已经被转化了, 可以使用read方法
    val data: String = file.read
    println(data)
  }
}
示例二:对自己定义的类使用隐式转换,普通人成为大佬
class AveragePerson(val name: String)


class Mogul(val name: String) {
  def come(): Unit = {
    println("大佬 "+ name + " 来了,掌声想起,自带光环,疯狂撒钱!")
  }
}


object TransformExec {

  implicit def AveragePerson2Mogul(averagePerson: AveragePerson): Mogul = {
    new Mogul(averagePerson.name)
  }

  def main(args: Array[String]): Unit = {
    val mogul = new AveragePerson("橙子园")
    mogul.come()
  }
}

结果:
在这里插入图片描述

示例三:一个类隐式转换具有相同方法的类的情况
class A
class B(a: A) {
  def readBook(): Unit ={
    println("B读书")
  }
}

class C(a: A){
  def readBook(): Unit ={
    println("C读书")
  }
  def writeBook(): Unit ={
    println("C写书")
  }
}

object BC{

  //创建一个类转换为2个类的隐式转换
  implicit def A2B(a: A)=new B(a)
  implicit def A2C(a: A)=new C(a)
}

object C{
  def main(args: Array[String]) {
    //导包
    //import BC._ 这会将AB类下的所有隐式转换导进来
    //import BC.A2B 只导入A类到B类的的隐式转换方法
    //import BC.A2C 只导入A类到C类的的隐式转换方法


    import BC._
    val a = new A

    //由于B类与C类中都有readBook(),只能导入其中一个,否则调用共同方法时代码报错
    //a.readBook()

    //A类可以执行C类中的writeBook()
    a.writeBook()

  }
}

结果:
在这里插入图片描述

2、隐式参数

它是指在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的用implicit修饰的参数,即隐式值,并注入参数。隐式参数也需要定义在一个object中。

示例:隐式参数的使用,老板给员工发钱
object Company{
  //注意:同一类型的隐式值只允许出现一次,否则会报错
  implicit val name: String = "橙子园"
  implicit val salary: Double = 100000.0
  //再次出现会报错
  //implicit  val zzz: String="橙子猿"

}

class Boss {
  //定义一个用implicit修饰的参数类型为String
  //注意参数匹配的类型,它需要的是String类型的隐式值
  def callName(implicit name: String): String={
    name
  }

  //定义一个用implicit修饰的参数,类型为Double
  //注意参数匹配的类型,它需要的是Double类型的隐式值
  def getMoney(implicit money: Double): String={
    money.toString
  }

}

object Boss extends App{
  //使用import导入定义好的隐式值,注意:必须先加载否则会报错
  import Company.name
  import Company.salary

  val boss = new Boss
  println(boss.callName + ":" + boss.getMoney)

}

结果:
在这里插入图片描述

目录
相关文章
|
5月前
|
编译器 Scala
scala-柯里化、隐式转换、泛型、upperbound、viewbound、contextBound
scala-柯里化、隐式转换、泛型、upperbound、viewbound、contextBound
29 0
|
Scala
173 Scala 隐式转换和隐式参数
173 Scala 隐式转换和隐式参数
35 0
|
6月前
|
SQL 分布式计算 编译器
Scala:高阶函数、隐式转换(四)
Scala:高阶函数、隐式转换(四)
54 0
|
分布式计算 Java 编译器
关于jvm范型和scala implicit隐式参数以及classTag[T] typeTag[T]的一点思考
关于jvm范型和scala implicit隐式参数以及classTag[T] typeTag[T]的一点思考
124 0
|
大数据 Scala 开发者
大数据开发基础的编程语言的Scala的隐式转换
Scala是一种支持隐式转换的编程语言,它提供了一种很方便的方式来实现代码的扩展和重用。本文将介绍Scala中隐式转换的概念和用法,帮助开发者更好地理解和应用这门语言。
93 0
|
编译器 Scala
Scala系列之隐式转换和隐式参数
Scala系列之隐式转换和隐式参数5.1. 概念隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。 5.2. 作用隐式的对类的方法进行增强,丰富现有类库的功能 object ImplicitDemo exten...
713 0
|
Scala
Scala入门到精通——第十九节 隐式转换与隐式参数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自动帮我们搜索相应的隐式值,并将该隐式值作为函数的参数,这里
2782 0
|
1月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
49 5