Vla*_*eev 5 types scala path-dependent-type
Scala Await.ready()方法定义如下:
def ready[T](awaitable: Awaitable[T], atMost: Duration): awaitable.type = ...
Run Code Online (Sandbox Code Playgroud)
也就是说,返回类型是路径依赖类型的awaitable参数.我认为(和IntelliJ IDEA同意我)这意味着如果我传递Future给函数,它应该返回Future相同的类型,事实上,它确实在简单的情况下工作:
val f: Future[Int] = Future { 10 }
val ft: Future[Int] = Await.ready(f, ???)
Run Code Online (Sandbox Code Playgroud)
这段代码编译,也就是说,Await.ready()这里真正返回Future[Int].但是,以下就不能正常工作:
val f: Future[Int] = Future { 10 }
val ft: Future[Int] = Await.ready(f.map(identity), ???)
Run Code Online (Sandbox Code Playgroud)
它失败并出现此错误:
[error] /Users/netvl/dev/work/sandbox/src/main/scala/circuit/actors/Example.scala:53: type mismatch;
[error] found : awaitable.type (with underlying type scala.concurrent.Awaitable[Int])
[error] required: scala.concurrent.Future[Int]
[error] val ft: Future[Int] = Await.ready(f.map(identity), ???)
[error] ^
Run Code Online (Sandbox Code Playgroud)
为什么会这样?f.map(identity)返回Future[Int],所以我认为调用返回另一个未来的未来方法也应该有效.解决这个问题的唯一方法(除了重写)似乎是asInstanceOf[Future[Int]]调用,类型归属不起作用.
BTW,作为一个小问题,如何variable.type正确调用语法?我知道它与路径相关的类型有关,但我找不到它的确切名称或描述,并且很难用谷歌搜索它.
我正在使用Scala 2.10.4.
Scala 版本在这里会很有帮助。使用 Scala 2.11.1 它工作得很好:
scala> val f: Future[Int] = Future(10)
f: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@68d0db31
scala> val ft: Future[Int] = Await.ready(f.map(identity), 1.second)
ft: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@68d0db31
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |