scala 开发入门(9)-- 隐式转换

隐式转换是 scala 语言提供的一种强大的语法特性,是学习 scala 必须掌握的技能。与scala 中的模式匹配一样,scala 的隐式转换也是无处不在的。scala 已经默认帮我们实现了大量的隐式转换函数。

隐式转换函数的定义

//使用 implicit 关键字定义
implicit def int2float(x:Int):Float = x.toFloat

//于是可以直接将整型值赋给 Float 类型的变量
var x:Float = 1
//但直接将 Float 变量赋值给 Int 类型变量会报错
val intValue:Int = 2.55f
<console>:7:error:type mismatch
...

//要使可以直接将 Float 变量赋值给 Int 类型不报错,可定义隐式转换函数如下
implicit def float2int(x:Float):Int = x.toInt
scala> val intValue:Int = 2.55f
intValue:Int = 2

隐式转换函数名称

隐式转换函数 implicit def function  中的函数名可以是任意的,即隐式转换函数与函数名称无关,只与函数签名(输入参数类型与返回值类型)有关。如果在当前作用域范围存在函数签名相同的但函数名称不同的两个隐式转换函数,则在进行隐式转换时会报错。

//定义一个名称为 float2int 的隐式转换函数,输入参数类型为 Float,返回值类型为 Int
implicit def float2int(x:Float) = x.toInt
//定义一个名称为 f2i 的隐式转换函数,输入参数类型为 Float,返回值类型为 Int
implicit def f2i(x:Float) = x.toInt

//执行隐式转换时会报错,提示有歧义,因为两个隐式转换函数都能实现 Float 到 Int 的转化
val intValue:Int = 2.55f
<console>:10:error:type mismatch;
  found :Float(2.55)
  ...

隐式类

//通过 implicit 关键字定义一个隐式类,该隐式类的主构造函数接受一个 String 类型的参数
//可以完成 String 类型到 Dog 类型的转化
implicit class Dog(val name:String){
  def bark = println(s"$name is barking")
}

//String 类型并不存在 bark 方法,但由于定义的隐式类会进行类型转换,因此编译器
//会将 String 类型转换成 Dog 类型,再执行 bark 方法
"Nacy".bark

运行结果:
Nacy is barking

可以看到,隐式类的作用原理是通过隐式转换来实现的,相比于显式定义隐式转换函数,隐式类中的隐式转换隐藏的更深。
需要注意的是,隐式类的主构造函数参数有且仅有一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值