因而本身就改編了一下: java
import java.text.SimpleDateFormat import java.util.{Calendar,Date} sealed abstract class Day abstract class Forward extends Day abstract class Backward extends Day case object ago extends Backward case object before extends Backward case object after extends Forward case object later extends Forward class DSL(x:Int){ def days(day:Day)={ var can=Calendar.getInstance def backward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)-x) def forward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)+x) day match{ case day:Backward => backward() case day:Forward => forward() case _ => } DSL.formats(can.getTime) } } object DSL{ implicit def intToDSL(x:Int)=DSL(x) def apply(x:Int)=new DSL(x) def formats(date:Date)=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date) def now=formats(Calendar.getInstance.getTime)+" => now..." def main(args:Array[String]):Unit={ println(now) println(2 days ago) println(3 days before) println(3 days after) println(4 days later) } }環境2.8.1.final,另存爲xxx.scala文件
這個例子涉及到的知識點有:包引用,密封類,case object,隱式轉換,模式匹配,函數,apply方法;
開始我是用case class,有點冗餘,這裏只是當作消息處理,因而改爲case object;
解釋一下,運行2 days ago這行代碼,2是整型對象,它沒有days方法,就會在執行的上下文裏找一個隱式函數,這個隱式函數能夠把整型對象轉換成帶有days方法的目標對 象,若是預導入的PreDef對象內也含有一個作到上述功能的隱式函數,那麼編譯器會認爲這是衝突,沒法編譯:
Note that implicit conversions are not applicable because they are ambiguous
這裏我認爲,編譯器應該優先去找用戶自定義隱式函數,而不是報錯,呵呵,那樣的話編譯器要作更多的工做了。 app