找不到参数 e 的隐式值

could not find implicit value for parameter e

case class Cat(name: String)

object CuterImplicits {
  implicit class CatCuteChecker(c: Cat) {
    def isCute(c: Cat) = true
  }
}

trait CuteChecker[A] {
  def isCute(a: A): Boolean
}

object CheckingForCuteness {
  def isItCute[A](a: A) = implicitly[CuteChecker[A]].isCute(a)
}

object Main extends App {
  CheckingForCuteness.isItCute[Cat](Cat("funny"))
}

如何修复:

Error:(17, 37) could not find implicit value for parameter e: CuteChecker[A] def isItCute[A](a: A) = implicitly[CuteChecker[A]].isCute(a) ^

您的情况存在多个问题。 implicitly 调用需要一个 CuteChecker 特征的实例,而 CatCuteChecker 既不是实例也不扩展这个特征。此外, c class 参数是完全没有必要的。

您可以通过声明子类型关系并提供 implicit value:

来解决您的问题
object CuterImplicits
{
    class CatCuteChecker with CuteChecker
    {
        def isCute(c: Cat) = true
    }

    implicit val catCuteChecker = new CatCuteChecker
}

如果您使用 implicitly,那只会使 a value implicitly in scope "explicitly" available。因此,您的 isItCute 方法应该是以下两种变体之一:

def isItCute[A: CuteChecker](a: A) = implicitly[CuteChecker[A]].isCute(a)

def isItCute[A](a: A)(implicit cc: CuteChecker[A]) = cc.isCute(a)

接下来您需要 Cat 的隐式实例。 implicit class 在这里对您没有帮助,因为它需要类型为 Cat 的非隐式值。您可以看到这种方法是错误的,因为从未使用过构造函数参数。您可以使用 implicit object:

implicit object CatCuteChecker extends CuteChecker[Cat] {
  def isCute(c: Cat) = true
}

最后,您在对象 CuterImplicits 中提供了隐式。要让它们对 Main 可见,您需要 import the contents:

object Main extends App {
  import CuterImplicits._
  CheckingForCuteness.isItCute[Cat](Cat("funny"))
}

隐式必须在调用时可见不合格。 隐式变得可见的不同方式在这个答案中得到了最好的描述: .

你想要实现的目标也不完全清楚 并且有许多可能的方法来实现某些东西就像这个例子。

一种可能性是猴子使用隐式 class:

修补 Cat
case class Cat(name: String)

object CuteImplicits {
  implicit class CuteCat(c: Cat){
    def isCute = true
  }
}

object Main extends App {
  import CuteImplicits._
  Cat("funny").isCute
}

你在关联类型的伴生对象中放入隐式,它会自动可见。

case class Cat(name: String)

object Cat {
  implicit class CuteCat(c: Cat){
    def isCute = true
  }
}

object Main extends App {
  Cat("funny").isCute
}

在像这样的最小示例中,不清楚为什么您不将功能直接构建到 Cat