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

时间:2014-07-09 09:20:14

标签: scala types path-dependent-type

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。

1 个答案:

答案 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