Scala提供的隐式转换特性可以在效果上给一个类增加一些方法,或者用于接收不同类型的对象.
implicit关键字只能用来修饰方法、变量(参数)和伴随对象。
隐式转换的方法(变量和伴随对象)在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导。举例
package demo {
package util {
import java.util.Date
import java.text.SimpleDateFormat
object DateUtil {
class DateWrapper(date: Date) {
def format(str: String) = new SimpleDateFormat(str).format(date)
}
implicit def toDateWrapper(date: Date) = new DateWrapper(date)
}
}
package service {
import java.text.SimpleDateFormat
import java.util.Date
// 注: 必须将object Rest的定义放在class Rest之前,或者显式指出str2Date的返回类型,否则编译不通过
object Rest{
class RichDate(str: String){
def toDate(): Date = new SimpleDateFormat("yyyy-MM-dd").parse(str)
}
implicit def str2Date(str: String) = new RichDate(str)
}
class Rest {
import util.DateUtil._
import Rest._
// 必须把demo.util包下的伴随对象DateWrapper中的所有成员引进来
def today = new Date().format("yyyy-MM-dd");
// 伴随对象 Rest中定义了一个隐式转换函数
def getDate(str: String): Date = str.toDate();
}
}
object SC4 {
import demo.service.Rest
def main(args: Array[String]) ={
println (new Rest().today)
println(new Rest().getDate("2011-01-09"))
}
}
}
但有一种情况例外,源类型或目标类型(包括源类型和目标类型的类型变量的类型)的伴随对象中隐式转换函数(或变量,伴随对象)不需要显示导入。 比如
package demo{
object MyTestApp{
def main(args: Array[String]): Unit = {
val myTest = new MyTest();
myTest.printInt(4)
myTest.printYourTest(myTest) // the source type is of MyTest while the target require YourTest
myTest.fuxkTest() // there is no method on MyTest but we can still call it
}
}
class YourTest{
override def toString = "Your Test"
def fuxkTest() = print("fuxk Test");
}
object YourTest{
implicit def myTest2YourTest = new YourTest
}
class MyTest{
import MyTest._
def printStr(str: String) = println(str)
// you can't do it like `printStr(i)` unless you bring the implicit converter `MyTest.int2String`into scope
def printInt(i: Int) = printStr(i)
def printYourTest(obj: YourTest) = println(obj)
def getYorTest(): YourTest = this;
}
object