Scala隐式转换说明和使用
对于大部分编程语言而言,变量的隐式转换是编程语言所自带的,但是在Scala中提供了一种可以自定义隐式转换的方法。
隐式转换函数
隐式转换函数需要具备三个条件:
- 确定的返回值和返回值类型;
- 确定的函数参数和函数参数类型;
- 用implicit进行修饰。
具体实例如下:
object ImplicitOps1 {
def main(args: Array[String]): Unit = {
var numInt:Int=5
val numFloat:Float=numInt
println(numInt,numFloat)
val str="Scala"
numInt=str
println(str,numInt)
}
implicit def int2float(num:Int):Float=num.intValue()
implicit def string2Int(str:String):Int=str.size
}
隐式转换丰富数据类型的方法
通过隐式转换的方式,程序员可以给Scala原有的数据结构自定义API函数,具体实现过程如下:
object ImplicitOps2 {
def main(args: Array[String]): Unit = {
val array:Array[Int]=Array(1,4,6,7,1,4,8)
array.showMessage()
val floatArray:Array[Double]=Array(4.0,5.0,6.7)
floatArray.showMessage()
}
implicit def Array2Myarray[T](array: Array[T]):myArray[T]=new myArray[T](array)
class myArray[T](array: Array[T]){
def showMessage(): Unit ={
println(array.mkString("[",",","]"))
}
}
}
隐式转换参数
隐式转换参数指在函数或方法中定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型用implicit修饰的对象,即隐式值,并注入参数。
两个地方进行寻找:
- 当前作用域内可见的val或var定义的隐式变量;
- 隐式参数类型的伴生对象内的隐式值。
具体实例如下:
object ImplicitOps3 {
def main(args: Array[String]): Unit = {
var myArray:Array[Int]=Array(5,6,45,1,8,9,25,0,4,91)
println("排序前:"+myArray.mkString("[",",","]"))
var newArray=myArray.sortWith(_<_)
println("排序后:"+newArray.mkString("[",",","]"))
implicit val ord=new Ordering[Int](){
override def compare(x: Int, y: Int): Int = y.compareTo(x)
}
newArray=myArray.sorted
println("排序后:"+newArray.mkString("[",",","]"))
}
}