为什么Scala强制使用Await而不是Awaitable?

时间:2019-04-01 19:45:55

标签: scala

Awaitable trait要求使用CanAwait隐式变量,该隐式变量不能在concurrent软件包之外使用。因此,从技术上讲,您不允许直接调用Awaitable方法,而应使用Await对象。

我想了解为什么做出这样的设计决定。

trait Awaitable[+T] {
  def ready(atMost: Duration)(implicit permit: CanAwait): this.type
}

package concurrent {
  sealed trait CanAwait
  private[concurrent] object AwaitPermission extends CanAwait 

  object Await {
    def ready[T](awaitable: Awaitable[T], atMost: Duration): awaitable.type =
      blocking(awaitable.ready(atMost)(AwaitPermission))
  }
}

1 个答案:

答案 0 :(得分:0)

因为它们不是您能够在自己的类中覆盖Awaitable.ready的东西。 他们可以将其设置为private[concurrent],但是您也将无法对其进行调用。他们也可以将其设置为final,但是不可能在子类中覆盖它(其中只有一个,因此,在这种情况下这并不是真正的问题……但是,如果他们想添加更多内容,该怎么办?以后吗?)