Use val with an explicit return type. See https://github.com/scala/bug/issues/801 and https://github.com/scala/bug/issues/8697 (among others).
Implicit objects have the same problem as implicit vals and defs with supposed return types. As for your second question: when IntTC used explicitly, you force the compiler to check its type, so after that its type is known and can be found by an implicit search.
class Wrapper { import Wrapper._ def init(): Unit = { // Compiles printWithTC(123) // Compiles printWithTC(123)(IntTC) // Compiles printWithTC(132) } } object Wrapper { trait TC[A] { def text(a: A): String } implicit val IntTC: TC[Int] = new TC[Int] { override def text(a: Int) = s"int($a)" } def printWithTC[A](a: A)(implicit tc: TC[A]): Unit = { println(tc.text(a)) } }
If you really want your implicit to be evaluated lazily as an object, you can use implicit lazy val with an explicit type.
source share