Существуют различные возможные решения для этого, в зависимости от того, хочу ли я решить проблему только для C или хочу ли я решить проблему для всего класса типов .
Только для C, вместо implicit object FooC ...
мы говорим:
implicit def CIsFoo[T <: C]: Foo[T] =
new Foo[T] { override def foo(t: T) { println("it's a C!") } }
Чтобы исправить все Foo, сделайте его контрвариантным:
trait Foo[-T] { def foo(t: T) }
Или если по какой-то причинеВы не можете или не хотите этого делать, вы можете заменить def foo...
на:
def foo[T](t: T)(implicit foo: Foo[_ >: T]) =
foo.foo(t)
(Спасибо #scala обитателям Даниэлю Собралу и Стефану Зайгеру за помощь.)
ОБНОВЛЕНО 20 сентября 2011 года, чтобы включить решение "make Foo контрвариантное", которое я пропустил