版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myvanguard/article/details/86645002
第5章 Scala隐式转换彻底精通
Scala隐式转换让Scala编程语言更加富有表现力,不需要将一些显而易见的类型转换写进代码。Scala隐式转换也帮助实现不需要修改代码就可以扩展新功能。Scala隐式转换用implicit修饰符表示,可以作用在诸如类、参数和值等Scala关键字,使之分别成为隐式类、隐式参数和隐式值。
5.1隐式转换
5.1.1隐式转换的使用条件
隐式转换是函数参数或者对象的隐式转换,隐式值必须在伴生对象中声明。
隐式转换使用的条件。
(1)传入参数类型与预期类型不匹配时,会找是否有将该参数类型转为预期参数类型的隐式值; 如果调用该函数的对象可以找到匹配的隐式值,同样会发生隐式转换;
(2)当对象访问不存在的成员时,会找该对象是否有转换成其他对象的隐式值。
使用隐式转换的限制条件。
(1)implicit关键字只能用来修饰方法、变量(参数)和伴随对象;
(2)隐式转换的方法(变量和伴随对象)在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导入。
5.1.2隐式转换实例
隐式转换是Scala的重难点之一
隐式函数
object ImplicitTest {
implicit def a2RichA(a:A)= new RichA(a)//定义一个名称为a2RichA的隐式方法
def main(args: Array[String]): Unit = {
val a = new A
//对象A并没有rich方法,编译器会查找当前范围内是否有可转换的方法
a.rich
}
}
class Implicit{
}
class A{
}
class RichA(a: A){
def rich: Unit ={
println("Hello Scala Implicit")
}
}
Int 类型隐式转换成String类型
//Int类型隐式转换成String类型
object Int2StringTest {
implicit def int2String(i: Int) = i.toString
def main(args: Array[String]): Unit = {
//Int类型没有.length()方法
println(3.length)
}
}
导入隐式函数
object FuncTest {
implicit def int2String(i:Int)=i.toString
}
object Int2StringTest{
//将FuncTest对象内部的成员导入到相应的作用域内,否则无法调用隐式函数
import FuncTest._
def main(args: Array[String]): Unit = {
println(3.length)
}
}
5.2隐式类
所谓隐式类:就是对类增加implicit限定的类,其作用主要是对类的加强。
隐式类实战
object PracticeTest {
def main(args: Array[String]): Unit = {
println(2.add(3))
}
implicit class Cal(x:Int){
//Int类型本省没有add方法
def add(a:Int)={
a +x;
}
}
}
5.3隐式参数详解
隐式参数实战
object ArglmplicitTest {
def main(args: Array[String]): Unit = {
hiScala
}
//函数的隐式值会在本实例域内找一个对应的字符串类型的隐式值。
implicit val name: String = "tom"
//implicit val sex:String = "male"
def hiScala(implicit str: String): Unit = {
println("str is " + str)
}
}
5.4隐式值
隐式值就是定义在object对象中的隐式变量。
object VarImplicit {
implicit val name: String = "history"
def hiScala(implicit str: String): Unit = {
println("str is " + str)
}
def main(args: Array[String]): Unit = {
hiScala
}
}