Scala隐式变换
隐式(implicit)是Scala中的一个强大的特性,使用隐式可以减少代码,能够向已有的类型注入新的方法。
1.隐式函数的使用
implicit def intToFloat(X: Int): Float = x.toFloat // 此时函数的返回类型需要和 变量的类型是一样的
implicit def floatToInt(x1: Float): Int = x1.toInt
val x: Float = 2 // 定义了隐式函数,代码才不会报错
val x1: Int = 12.111f // 转换成int型, 需要定义类型
val x3 = 12.34f
println(x3) // 12.34
println(x1) // 12
println(x) // 2.0
备注:
在使用带有隐式参数的函数时,如果没有明确指定与参数类型匹配相同的隐式值,编译器不会通过额外的隐式转换来确定函数的要求。
要求:
1) 隐式转换函数的函数名可以是任意的,与函数名称无关,只与函数签名(函数参数和返回值类型)有关。
2)如果当前作用域中存在函数签名相同但函数名称不同的两个隐式转换函数,则在进行隐式转换时会报错。
2.隐式类的使用
可以增加类 的方法
implicit class Hu(val h: Human){ // 隐式类的主构造函数参数有且仅有一个!
def anotherName(name: String): String={
"this is another name: " + name
}
}
val h1 = new Human // 需要先实例化对象
println(h1.getName("name1"))
println(h1.anotherName("name2")) // 增加一个类的方法
class Human(){
def getName(name: String): String = {
"this is name: " + name
3.隐式值与隐式参数
如果函数还有默认的参数值的话,优先调用隐式值
定义一个隐式值:
implicit val notName: String = "mike" // 定义一个隐式值 ,参数可以与函数的参数名称不相同
implicit val notName: String = "mike" // 定义一个隐式值 ,参数可以与函数的参数不相同
// 如果函数还有默认的参数值的话,优先调用隐式值
def sayHello(implicit name1: String = "Tom"): Unit = println("hello, " + name1) // 定义一个隐式参数
sayHello // 不要增加括号, hello, mike
def notSayHelloToMike(name: String = "Tom"): Unit = println("hello, " + name)
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
还没有评论,来说两句吧...