Akka 流 - 为什么 ActorSystem 只有在标记为隐式时才被接受为 Materalizer?

Akka streams - why is an ActorSystem accepted as a Materalizer only when it is marked as implicit?

我正在查看 akka 流快速入门教程,我想了解一段代码的工作原理。示例中的以下代码将 1 到 100 的值打印到控制台:

import akka.stream.scaladsl._
import akka.{Done, NotUsed}
import akka.actor.ActorSystem

object Akka_Streams extends App{
  implicit val system: ActorSystem = ActorSystem("QuickStart")
  val source: Source[Int, NotUsed] = Source(1 to 100)

  source.runForeach(i => println(i))
}

我不明白的是,当我将代码更改为以下内容并删除隐式时,代码不再有效。我收到类型不匹配错误(显示在以下代码下方):

object Akka_Streams extends App{
  val system: ActorSystem = ActorSystem("QuickStart")
  val source: Source[Int, NotUsed] = Source(1 to 100)

  source.runForeach(i => println(i))(system)
}

错误:

type mismatch; found : akka.actor.ActorSystem required: akka.stream.Materializer source.runForeach(i => println(i))(system)

为什么以前可以,现在不行? source.runForeach 方法采用 Materalizer 类型,所以我想知道为什么它一开始就起作用了?据我所知,ActorSystem 不是 Materalizer 或其子类型,所以我很困惑。

这与 Scala 编译器如何将 ActorSystem 转换为 Materializer

有关

这是通过implicit conversions用下面的方法完成的

 /**
   * Implicitly provides the system wide materializer from a classic or typed `ActorSystem`
   */
  implicit def matFromSystem(implicit provider: ClassicActorSystemProvider): Materializer =
    SystemMaterializer(provider.classicSystem).materializer

要求参数providerimplicit

因此拥有 implicit 键允许编译器在需要 Materializer 的实例时采用隐式角色系统,并且无需在其中显式定义实体化器即可完成此类转换范围。