Scala隐式变换

Bertha 。 2022-03-26 12:50 215阅读 0赞

隐式(implicit)是Scala中的一个强大的特性,使用隐式可以减少代码,能够向已有的类型注入新的方法。

1.隐式函数的使用

  1. implicit def intToFloat(X: Int): Float = x.toFloat // 此时函数的返回类型需要和 变量的类型是一样的
  2. implicit def floatToInt(x1: Float): Int = x1.toInt
  3. val x: Float = 2 // 定义了隐式函数,代码才不会报错
  4. val x1: Int = 12.111f // 转换成int型, 需要定义类型
  5. val x3 = 12.34f
  6. println(x3) // 12.34
  7. println(x1) // 12
  8. println(x) // 2.0

备注:

在使用带有隐式参数的函数时,如果没有明确指定与参数类型匹配相同的隐式值,编译器不会通过额外的隐式转换来确定函数的要求。

要求:

1) 隐式转换函数的函数名可以是任意的,与函数名称无关,只与函数签名(函数参数和返回值类型)有关。

2)如果当前作用域中存在函数签名相同但函数名称不同的两个隐式转换函数,则在进行隐式转换时会报错。

2.隐式类的使用

可以增加类 的方法

  1. implicit class Hu(val h: Human){ // 隐式类的主构造函数参数有且仅有一个!
  2. def anotherName(name: String): String={
  3. "this is another name: " + name
  4. }
  5. }
  6. val h1 = new Human // 需要先实例化对象
  7. println(h1.getName("name1"))
  8. println(h1.anotherName("name2")) // 增加一个类的方法
  9. class Human(){
  10. def getName(name: String): String = {
  11. "this is name: " + name

3.隐式值与隐式参数

如果函数还有默认的参数值的话,优先调用隐式值

定义一个隐式值:

  1. implicit val notName: String = "mike" // 定义一个隐式值 ,参数可以与函数的参数名称不相同
  2. implicit val notName: String = "mike" // 定义一个隐式值 ,参数可以与函数的参数不相同
  3. // 如果函数还有默认的参数值的话,优先调用隐式值
  4. def sayHello(implicit name1: String = "Tom"): Unit = println("hello, " + name1) // 定义一个隐式参数
  5. sayHello // 不要增加括号, hello, mike
  6. def notSayHelloToMike(name: String = "Tom"): Unit = println("hello, " + name)
  7. notSayHelloToMike() // 此时, 调用函数是需要加括号的

隐式参数使用的常见问题:
1)当函数没有柯里化时,implicit关键字会作用于函数列表中的的所有参数。

2)隐式参数使用时要么全部不指定,要么全不指定,不能只指定部分。
3)同类型的隐式值只能在作用域内出现一次,即不能在同一个作用域中定义多个相同类型的隐式值。

4)在指定隐式参数时,implicit 关键字只能出现在参数开头。

5)如果想要实现参数的部分隐式参数,只能使用函数的柯里化,

如要实现这种形式的函数,def test(x:Int, implicit y: Double)的形式,必须使用柯里化实现:def test(x: Int)(implicit y: Double).

6) 柯里化的函数, implicit 关键字只能作用于最后一个参数。否则,不合法。

7)implicit 关键字在隐式参数中只能出现一次,柯里化的函数也不例外!

参考:https://blog.csdn.net/m0\_37138008/article/details/78120210

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读

    相关 scala解析机制

    1)说明 (1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一 般是这种情况) (2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类

    相关 Scala转换

    Scala之隐式转换 一、隐式函数 1)说明 > 隐式转换可以再不需改任何代码的情况下,扩展某个类的功能。 2)案例实操 需求:通过隐式转化为Int类型增加方

    相关 Scala转换与参数

        Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它允许程序员手动指定,将某种类型的对象转换为其他类型的对象,通过这些功能,

    相关 Scala变换

    隐式(implicit)是Scala中的一个强大的特性,使用隐式可以减少代码,能够向已有的类型注入新的方法。 1.隐式函数的使用 implicit def in