为什么 `Future#toString` returns `"List()"`?

Why does `Future#toString` returns `"List()"`?

在未等待完成的情况下调用 .toString 会导致不确定的结果。我的问题是 为什么 在 scala 2.10.x 和 2.[=44= 中对未完成的期货 returns "List()" 调用 .toString ]? The implementation 似乎没有明确说明这一点。

可以从 REPL 中观察到此行为:

scala> import scala.concurrent.Future, scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> Future(1).toString
res0: scala.concurrent.Future[Int] = Success(1)

scala> Future(1).toString
res1: scala.concurrent.Future[Int] = List()

请注意,Scala 2.12.x 可能会将 Future#toString 显式实现为 return "Future(<not completed>)" 而不是 (source).


编辑:证明这不是来自 REPL 或 "some hidden implicit" 的人工制品(-Yno-predef 删除所有默认隐式):

Future.scala:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main extends App {
  System.out.println(Future(1).toString)
}

build.sbt:

scalaVersion := "2.11.8"

scalacOptions := Seq(
  "-deprecation",
  "-encoding", "UTF-8",
  "-feature",
  "-unchecked",
  "-Yno-predef",
  "-Xfatal-warnings",
  "-Xlint",
  "-Yinline-warnings",
  "-Yno-adapted-args",
  "-Ywarn-dead-code",
  "-Ywarn-unused-import",
  "-Ywarn-numeric-widen",
  "-Ywarn-value-discard",
  "-Xfuture")

移除 sun.misc.Unsafe 的依赖性是一个不幸的副作用。它在 Scala 2.12 和更新版本的 Scala 2.11 IIRC 中得到纠正。