隐式参数
方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记
- implicit只能修改最尾部的参数列表,应用于其全部参数
- Scala可自动传递正确类型的隐式值
- 通常与柯里化函数结合使用
def sum(x:Int)(implicit y:Int)=x+y
implicit var a=10 //将作为Int类型隐式值自动传递
sum(10) //20
示例
object test {
object test {
def main(args: Array[String]): Unit = {
implicit var a:Int=10
implicit var b:String="hello"
def test1(a:Int,b:Int)(implicit c:Int):Int={
a+b+c
}
def test2(a:Int,b:Int)(implicit c:Int=5,str:String):Int={
println(str)
a+b+c
}
println(test1(10,10))
println(test1(10,10)(20))
println(test2(10,10)(30,"hi"))
}
}
//优先级:传参>隐式参数>默认
隐式函数
隐式函数也称隐式转换,使用implicit修饰的函数
应用场景
- 类型转换
implicit def double2Int(x:Double)=x.toInt
val i:Int=3.5
类型增强
implicit def bool2Int(x:Boolean)=if(x) 1 else 0
println(1+true)
隐式类
隐式转换
- 隐式转换、隐式函数
- 隐式类:用implicit关键字修饰的类,其主构造器可用于隐式转换
只能在类、Trait、对象(单例对象、包对象)内部定义
构造器只能携带一个非隐式参数
隐式类不能是case class
在同一作用域内,不能有任何方法、成员或对象与隐式类同名
隐式类应用
为String对象增加新的方法
object Stringutils {
implicit class StringImprovement(val s:String){//隐式类
def increment=s.map(x=>(x +1).toChar)
}
}
object Main extends App{
import Stringutils._
println("mobin".increment) //输出:npcjo
}
示例
隐式类的使用,与Demo相关的隐式类要全部在Impliciteg中
创建好Demo对象中,虽然Demo中没有一个方法,但是因为隐式类中是有好多方法的,所以Demo对象后就可以使用这些方法
隐式类的主要作用就是:类对象中没有的方法可以直接被类对象调用
Impliciteg
package packagetwo
object Impliciteg {
//类的主构造器
implicit class a(demo: Demo){
def jia(a:Int,b:Int):Int={
a+b
}
def jian(a:Int,b:Int):Int={
a-b
}
def chen(a:Int,b:Int):Int={
a*b
}
def chu(a:Int,b:Int):Int={
a/b
}
}
}
package packagetwo
import packagetwo.Impliciteg._
class Demo {
}
object Demo{
def main(args: Array[String]): Unit = {
val dm=new Demo
var jiaResult=dm.jia(10,10)
var jianResult=dm.jian(10,10)
var chenResult=dm.chen(10,10)
var chuResult=dm.chu(10,10)
println(jiaResult)
println(jianResult)
println(chenResult)
println(chuResult)
}
}