找不到参数e的隐含值

时间:2015-12-25 20:35:04

标签: 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"))
}

如何修复:

  

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

3 个答案:

答案 0 :(得分:8)

如果您使用的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"))
}

答案 1 :(得分:0)

你的情况有多个问题。 implicitly调用期望CuteChecker特征的实例,而CatCuteChecker既不是实例,也不扩展此特征。此外,c类参数完全没必要。

您可以通过声明子类型关系并提供implicit 来解决您的问题:

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

    implicit val catCuteChecker = new CatCuteChecker
}

答案 2 :(得分:0)

隐含必须在调用时可见 不合格 。 在这个答案中最好地描述了隐含的不同方式。 https://stackoverflow.com/a/5598107/843348

你想要实现的目标还不完全清楚 并且有很多可能的方法可以实现之类的示例。

一种可能性是猴子使用隐式类修补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
}

您将implicits放在关联类型的伴随对象中,并且它会自动显示。

case class Cat(name: String)

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

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

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