Scala的隐式转换基本使用

0 阅读3分钟

内容:

1.什么是隐式转换

2.隐式函数

3.隐式参数

4.隐式函数的转换规则

5.隐式函数的作用域

什么是隐式转换

隐式转换是指:scala自动把一种类型转成另一种类型的过程。这个过程对用户编程而言不可见,不需要用户手动编写代码。

内容和代码如图可见:

屏幕截图 2025-12-29 145042.png

隐式函数

在scala.Predef中,可以看到有系统提供了默认的情况。

隐式函数的定义:通过implicit关键字修饰的函数,它的功能是把一种类型的数据转成另一种类型。

implicit def 函数名(参数:类型1):类型2 = {

函数体

}

注意点:

(1)调用时机,在系统自动把数据从类型1隐式转为类型2时出错时,被自动调用。

(2)函数名可以自定义(一般取名为类型1to类型2),但是参数和返回值必须有限制。

(二)隐式参数

如果一个参数的默认值会反复修改

来举个例子: 新的领导说用户密码是123456,在键盘的右边,对使用者不友好。要改成88888888

你看,这样就修改了原来的代码。

在开发的过程中,如果知道有个参数会被改动,就可以添加implicit,但是implicit在参数列表中只能出现一次,并要写在参数列表的最前面,对所有的参数列表生效。

如果一个函数有多个参数,并且你只想对某个参数进行隐式转换,那么,可以使用柯里化的方式来定义参数,并且把转换的参数定义在参数列表的最后。

先写入以下代码:

屏幕截图 2025-12-29 145810.png

然后以下有问题完成:

屏幕截图 2025-12-29 145605.png

如何去设置和解决问题,看以下:

屏幕截图 2025-12-29 150535.png

这样改成之后就可以完成想要的效果了

转换规则

隐式转换确实非常的强大,但是,在具体的使用过程中,我们要遵循一些特定的转换规则。

具体来说有两点:无歧义规则,不能多次转换。下面我们分别来解释

规则1:无歧义规则:不能重新定义两个相同的转换函数。如果有两个隐式转换函数,只有函数名不同,则会导致错误。

来结合具体的代码说明

如下的代码会导致编译错误。

错误的原因是这里有两个转换函数,导致代码在编译时,无法确定使用哪一个。

规则2:不能多次转换:在一次转换过程中可以把A->B,B->C,但是不能直接从A->C。来通过具体的代码来说明。可以把M->BM, 把BM->KM,但是依靠这两个规则自动推导M->KM就会报错。也就是说:隐式转换时只能转换一次。

举例子代码如下:

屏幕截图 2025-12-29 153340.png

作用域

接下来我们讨论一个问题:就是把隐式函数的定义放在哪里使用起来更加方便?当然了,在默认情况下,会在当前类的内部去找。

先说一个不能放的位置:implicit 不能放在顶级作用域(不能放在类的外边)看如下代码,就会报错

implicit class UserExt(user: User) {  
  def updateUser(): Unit = {  
    println("updateUser")  
  }  
}  
class User {  
  def insertUser(): Unit = {  
    println("insertUser")  
  }  
}  
object T1 extends  OtherClass {  
  def main(args: Array[String]): Unit = {  
    val u1 = new User()  
    u1.insertUser()  
    u1.updateUser()  
  }  
}

在实际的操作过程中,我们建议把它定义在如下两个地方:

1.包对象。这样在这个包下的所有类和对象中都可以使用,并且不需要额外的引入语句。

  1. 一个单独的文件定义中。这样在其他需要的位置就可以直接导入,然后使用。

在其他需要使用的地方导入: import implication.Implications._