Resolución implícita de parámetros para tipos superiores

Considere el siguiente código:

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])  //???
    }
}

Esto funciona, pero necesito escribir Some (42) como Opción [Int], de lo contrario, el objeto implícito OptionBar no se resolverá (porque en su lugar se espera una Barra [Some]). ¿Hay alguna manera de evitar el tipeo explícito, de modo que obtenga el objeto OptionBar implícito en la prueba incluso si realizo la prueba con Some o None?

[Aclaración]

Usé Option aquí solo como ejemplo, también debería funcionar si tengo unBar para una clase abstracta etc.La solución también debería funcionar cuando otras Barras no relacionadas están dentro del alcance, digamosimplicit object listBar extends Bar[list]

[Actualizar]

Parece que hacer el parámetro de Bar contravariante hace el truco:

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))
  }
}

Pero, por supuesto, esta es una limitación severa de las posibilidades en Bar, así que todavía espero una mejor respuesta.

Respuestas a la pregunta(2)

Su respuesta a la pregunta