所谓隐式转换函数指的是implicit关键字修饰的且只有一个参数的函数。
例如:
inplicit def int2String(n:Int):String = (n.toString)
上案例:我们把Fruit对象转换成了Monkey对象
//Scala的隐式转换
//水果
class Fruit(name:String){
def getFruitName():String = {name}
}
//猴子Monkey
class Monkey(f:Fruit){
def say() = {println("Monkey like " + f.getFruitName())}
}
object ImplicitDemo {
implicit def fruitToMonkey(f:Fruit):Monkey = {new Monkey(f)}
def main(args: Array[String]) {
//创建一个Fruit的对象
var f:Fruit = new Fruit("香蕉")
//问题:能否调用f.say() 方法呢?解决方法:将Fruit的对象转换为Monkey的对象
f.say()
}
}
隐式参数:使用implicit申明的函数参数叫做隐式参数。我们也可以使用隐式参数实现隐式的转换
//Scala的隐式参数
def testParam(implicit name:String) = {println("The value is " + name)}
//定义一个隐式参数
implicit val name:String="这是一个隐式值"
//问题:在调用的方法的时候,可以不用传递参数吗?
testParam
//使用隐式参数实现隐式的转换
//定义一个方法,找到两个值中较小的那个值
// 100 23 ---> 23
// Hello ABC ---> ABC
def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) = if(a < b) a else b
smaller(100,23)
smaller("Hello","ABC")
隐式类
所谓隐式类: 就是对类增加implicit 限定的类,其作用主要是对类的功能加强!
/**
* Scala的隐式类
*/
object ImplicitClass {
//隐式类
implicit class Calc(x:Int){
def add(a:Int):Int = a + x
}
def main(args: Array[String]) {
println("两个数字的和:" + 1.add(2))
}
/*
隐式类执行的过程:
1. 当1.add(2),scala的编译器不会立即报错;在当前域当中查找,有没有implicit修饰的,同时可以将Int作为参数的构造器,
并且具有add方法的类。通过查找,找到了Calc
2. 利用隐式类Calc来执行add方法
*/
}
版权声明:本文为wlk_328909605原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。