With an extra explicit parameter? No. Each typeclass instance must have the same interface, that of the typeclass. With an implicit parameter? Yes. You can declare an implicit def
that returns the required implicit but itself requires an implicit. Here is an example to explain:
case class Cat(name: String)
case class Person(name: String)
case class Silverware(kind: String)
implicit object GoodSilver extends Silverware("the good silver")
trait AnimalFeeder[A] {
def feed(animal: A): Unit
}
implicit object CatFeeder extends AnimalFeeder[Cat] {
def feed(cat: Cat) = println(cat.name + " eats cat food!")
}
implicit def personFeeder(implicit silverware: Silverware) =
new AnimalFeeder[Person] {
def feed(person: Person) =
println(person.name + " eats people food with " + silverware.kind)
}
def feedAnimal[A](a: A)(implicit feeder: AnimalFeeder[A]) = feeder.feed(a)
CatFeeder
provides an implicit that cat feed any Cat
. personFeeder
is a def
that can create an implicit to feed a Person
, but requires an implicit Silverware
. So in an invocation like:
feedAnimal(Person("John"))
The compiler will search for an implicit AnimalFeeder[Person]
, will find personFeeder
, and then will search for an implicit Silverware
, finally finding GoodSilver
.
It is important to note that personFeeder
is not an implicit conversion. Despite being a method from Silverware
to AnimalFeeder[Person]
it will never implicitly convert Silverware
. This is because its parameter is marked implicit
, implicit conversions must have their parameter explicit.