找不到参数e的隐含值

Jas*_*Jas 7 scala implicit

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"))
}
Run Code Online (Sandbox Code Playgroud)

怎么修:

错误:(17,37)找不到参数e的隐含值:CuteChecker [A] def isItCute [A](a:A)=隐式[CuteChecker [A]].isCute(a)^

0__*_*0__ 8

如果您使用implicitly它,只需在范围内"显式"提供隐式值.所以你的isItCute方法应该是以下两种变体之一:

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

def isItCute[A](a: A)(implicit cc: CuteChecker[A]) = cc.isCute(a)
Run Code Online (Sandbox Code Playgroud)

接下来,您需要一个隐式实例Cat.这implicit class对你没有帮助,因为它需要一个非隐式的类型值Cat.您可以看到此方法是错误的,因为从不使用构造函数参数.你可以使用implicit object:

implicit object CatCuteChecker extends CuteChecker[Cat] {
  def isCute(c: Cat) = true
}
Run Code Online (Sandbox Code Playgroud)

最后,您在object中提供了implicits CuterImplicits.要使它们可见Main,您需要导入内容:

object Main extends App {
  import CuterImplicits._
  CheckingForCuteness.isItCute[Cat](Cat("funny"))
}
Run Code Online (Sandbox Code Playgroud)