因而本身就改编了一下: 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