Scala Await.ready()
方法的定义如下:
def ready[T](awaitable: Awaitable[T], atMost: Duration): awaitable.type = ...
也就是说,返回类型是awaitable
参数的路径依赖类型。我认为(和IntelliJ IDEA同意我)这意味着如果我将Future
传递给函数,它应该返回相同类型的Future
,事实上,它确实在简单的情况下工作:< / p>
val f: Future[Int] = Future { 10 }
val ft: Future[Int] = Await.ready(f, ???)
此代码编译,即Await.ready()
这里确实返回Future[Int]
。但是,以下不工作:
val f: Future[Int] = Future { 10 }
val ft: Future[Int] = Await.ready(f.map(identity), ???)
失败并出现此错误:
[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] ^
为什么会这样? f.map(identity)
返回Future[Int]
,所以我认为调用返回另一个未来的未来方法也应该有效。解决此问题的唯一方法(除了重写)似乎是asInstanceOf[Future[Int]]
调用,类型归档不起作用。
BTW,作为一个小问题,如何正确调用variable.type
语法?我知道它与路径依赖类型有关,但我找不到它的确切名称或描述,并且很难用谷歌搜索它。
我使用的是Scala 2.10.4。
答案 0 :(得分:2)
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