Scala:无法从对象中找到隐式

Scala: Not able to find implicit from object

我有以下 Scala 代码。我不明白为什么隐式没有被编译器计算出来。我还尝试将导入行放在 Main 中。但是请注意,当在 Main 中创建隐式对象时,代码 运行 正确

import LoggingAddon._

object Main {
  def main(args: Array[String]): Unit = {
    val dog = new Dog
    Util.act(dog)
  }
}

class Dog {
  def bark(): Unit = {
    println("woof")
  }
}

trait Action[A] {
  def action(x: A): Unit
}

trait WithoutLogging[A] extends Action[A] {
}

trait WithLogging[A] extends Action[A] {
}

object LoggingAddon {

  implicit object DogWithLogging extends WithLogging[Dog] {
    override def action(x: Dog): Unit = {
      println("before")
      x.bark()
      print("after")
    }
  }
}

object NoLoggingAddion {

  implicit object DogWithoutLogging extends WithoutLogging[Dog] {
    override def action(x: Dog): Unit = {
      x.bark()
    }
  }
}

object Util {
  def act(x: Dog)(implicit nolog: Action[Dog]): Unit = {
    nolog.action(x)
  }
}

我已经从 LoggingAddon 导入了必要的隐式,但 scala 编译器仍然说 could not find implicit Action[Dog]

我想做的就是创建一个可插入的类型类。与其更改任何代码,不如更改导入语句以产生不同的副作用

简单地移动implicit导入的使用顺序,我在下面的例子中移到了底部

class Dog {
  def bark(): Unit = {
    println("woof")
  }
}

trait Action[A] {
  def action(x: A): Unit
}

trait WithoutLogging[A] extends Action[A] {
}

trait WithLogging[A] extends Action[A] {
}

object LoggingAddon {

  implicit object DogWithLogging extends WithLogging[Dog] {
    override def action(x: Dog): Unit = {
      println("before")
      x.bark()
      print("after")
    }
  }
}

object NoLoggingAddion {

  implicit object DogWithoutLogging extends WithoutLogging[Dog] {
    override def action(x: Dog): Unit = {
      x.bark()
    }
  }
}

object Util {
  def act(x: Dog)(implicit nolog: Action[Dog]): Unit = {
    nolog.action(x)
  }
}

import LoggingAddon._
object Main {
  def main(args: Array[String]): Unit = {
    val dog = new Dog
    Util.act(dog)
  }
}