Рассмотрим следующий код:
object foo {
trait Bar[Q[_]]
implicit object OptionBar extends Bar[Option]
def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()
def main(args: Array[String]) {
test(Some(42): Option[Int]) //???
}
}
Это работает, но мне нужно ввести Some (42) как Option [Int], иначе неявный объект OptionBar не будет разрешен (потому что вместо этого ожидается Bar [Some]). Есть ли способ избежать явной типизации, чтобы я получал неявный объект OptionBar в тесте, даже если я загружаю тест с помощью Some или None?
[Уточнение]
Bar
для абстрактного класса и т. Д. неявный объект listBar extends Bar [list]
[Обновление]
Похоже, что создание контравариантного параметра Bar помогает:
object foo {
trait Bar[-Q[_]] //<---------------
implicit object OptionBar extends Bar[Option]
implicit object ListBar extends Bar[List]
def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()
def main(args:Array[String]) {
test(Some(42))
}
}
Но, конечно, это серьезное ограничение возможностей Bar, поэтому я все еще надеюсь на лучший ответ.