您的位置:首页 > 其它

Scala 隐式转换

2018-03-12 15:46 232 查看
简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。

隐方式转换语法

“implict def”形式(Scala 2.10版本之前的写法)
object All_implicit {

//  “implict def”形式的隐式转换
object  Convert{
implicit def string2Int(str:String): Int ={
Integer.parseInt(str)
}
}

def main(args: Array[String]): Unit = {
import Convert._
val max = Math.max("193",45)
println(max)
}

}

“隐式类”
object All_implicit {

implicit class Convert(val str: String){
def strToInt:Int = {
str.toInt
}

def add:String = {
str+"***"
}
}

import com.test.Test_Implict.All_implicit.Convert
def main(args: Array[String]): Unit = {
val max = Math.max("193".strToInt,45)
val res = "hello".add
println(max)
println(res)
}

}
隐式类的限制它们必须在另一个特性/类/对象中定义。
他们只能在构造函数中取一个非隐式参数。
范围内可能没有任何方法、成员或对象具有与隐式类同名的名称或对象。注意:这意味着隐式类不能是case类。

隐式类与旧的隐式转换的语法(implicit def)是有细微的不同的,隐式类的运作方式是:隐式类的主构造函数只能有一个参数(有两个以上并不会报错,但是这个隐式类永远不会被编译器作为隐式类在隐式转化中使用),且这个参数的类型就是将要被转换的目标类型。

隐式转换的使用场景

类型转换
类的增强和扩展
模拟新的语法类类型

隐式参数

隐式参数与我们前面讲述的隐式类型转化有很大的差异,虽然它涉及到了关键字implict,但是它做的是另外一件事情。隐含参数有点类似缺省参数,如果在调用方法时没有提供某个参数,编译器会在当前作用域查找是否有符合条件的 implicit 对象可以作为参数传入,不同于缺省参数,隐式参数的值可以在方法调用的前的上下文中指定
object Param_Implicit {
implicit val temp = 66

object Greeter{
def greet(age1:Int)(implicit age2:Int):String={
s"the bigger is ${Math.max(age1,age2)}"
}
}

def main(args: Array[String]): Unit = {

val res = Greeter.greet(12)(32)
val res2 = Greeter.greet(12)
println(res)
println(res2)
}
}
参考:http://blog.csdn.net/bluishglc/article/details/50866314#reply
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息