2013-03-06 4 views
1

Я хочу ограничить параметр типа объединения A и B типов, где B - это общий тип, который будет подтипирован. Я хочу, чтобы поместить объекты в этом методе:Подкласс типа Typeclass

def accept[A](a:A)(implicit ev:FooOrBaish[A]){ /* do something */} 

Это, как мне определить implicits:

case class Foo(i:Int) 
trait Baish 
case object Bar extends Baish 
case class Baz(x:String) extends Baish 
class FooOrBaish[A] 
object FooOrBaish{ 
    implicit object FooWit extends FooOrBaish[Foo] 
    implicit object BaishWit extends FooOrBaish[Baish] 
} 

Теперь я могу поставить в принять Foo(5), но не может поставить там Baz("a") ни Bar , компилятор кричит: error: could not find implicit value for parameter ev: FooOrBaish[Baz]. Где можно указать отношение подтипа? Тип

ответ

1

Изменить FooOrBaish, чтобы быть контравариантен и она работает

class FooOrBaish[-A] 
Смежные вопросы