最近在https://github.com/ThoughtWorksInc/rest-rpc上工做,遇到了一个scala隐式转换的问题,简单的说是要实现这么个东西:css
implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = ???
把一种类型的Future(com.qifun.jsonStream.rpc.IFuture1)转换成为另外一种类型的Future(scala.concurrent.Future)。git
其中第一种Future的定义以下:github
public interface IFuture1<AwaitResult> { void start(ICompleteHandler1<AwaitResult> var1); }
而ICompleteHandler1的定义为:json
public interface ICompleteHandler1<AwaitResult> { void onSuccess(AwaitResult var1); void onFailure(Object var1); }
彼时对Future和Promise的概念尚未太好的理解,因此把一个将来变换成为另外一个将来这种虚无缥缈的东西仍是有点想象不来。因而尝试手工实现,ide
初版的想法是触发jsonStreamFuture的start方法,传给它一个ICompleteHandler1的实现,而后等到onSuccess方法获得调用的时候,把var1这个结果保存到jsonStreamFutureToScalaFuture这个函数的局部变量中(给其命名为acceptVar吧)。而后再定义一个Future,在Future的实现中不断的检查acceptVar是否有值了,若是有了则返回。这种朴素的想法写出来就是这样:函数
implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = { var acceptVar:Any = None jsonStreamFuture.start(new ICompleteHandler1[Value] { override def onSuccess(value: Value): Unit = acceptVar = value override def onFailure(ex: scala.Any): Unit = ??? }) new Future { def onSuccess[U](pf: PartialFunction[Value, Unit]): Unit = { while (acceptVar == None) { } pf(acceptVar.asInstanceOf[Value]) } } }
固然这是编译不过的。。。this
但即便可以编过,这种while循环的方式也是丑陋的没法接受的。因此开始探索更好的方式,既然在ICompleteHandler1的onSuccss函数中可以获得value,那主动去触发将要返回的那个Future实例内保存的onSuccess的回调如何?想让强类型的语言编译经过比较费劲,因此下面的代码还只是用来demo想法的:spa
implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = { var future = new Future( var successCallBack; def onSuccess(success: Success): Unit = { this.successCallBack = success; } ) jsonStreamFuture.start(new ICompleteHandler1[Value] { override def onSuccess(value: Value): Unit = future.successCallBack(value) override def onFailure(ex: scala.Any): Unit = ??? }) future }
因此当我最后使用Promise来解决相似问题的示例代码时候,我就意识到其思想和上述的第二种方法是相似的,写出来是这样的:scala
implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = { val p = Promise[Value]() jsonStreamFuture.start(new ICompleteHandler1[Value] { override def onSuccess(value: Value): Unit = p success value override def onFailure(ex: scala.Any): Unit = p failure ex.asInstanceOf[Throwable] }) p.future }
好吧,其实本文并无本身实现一个Promise,不过经过这种从新构造现有概念的方式(固然也是由于本身的无知- -)确实可以帮助对现有概念的理解。rest