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)中 ^
答案 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
中构建功能。