Рассмотрим следующий код:
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?
[Разъяснение]
- Я использовал здесь в качестве примера Option, он также должен работать, если у меня есть
Bar
для абстрактного класса и т. Д.
- Решение также должно работать, когда другие, не связанные бары находятся в области действия, скажем
implicit object listBar extends Bar[list]
[Update]
Кажется, что создание параметра Бара контравариантным делает свое дело:
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))
}
}
Но, конечно, это серьезное ограничение возможностей в Баре, поэтому я все еще надеюсь на лучший ответ.