返回类型取决于参数类型(例如Await.ready())无法按预期工作

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.

dre*_*xin 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
Run Code Online (Sandbox Code Playgroud)