Used as a term the[T] yields the unique implicit value of type T in the current
implicit scope, if any. It is a compile time error if there is no such value. Its
primary advantage over Predef.implicitly is that it will preserve any refinement that
the implicit definition has, resulting in more precisely typed, and hence often more
useful, values,
scala> trait Foo { type T ; val t: T }
defined trait Foo
scala> implicitval intFoo: Foo { type T = Int } = new Foo { type T = Int ; val t = 23 }
intFoo: Foo{type T = Int} = $anon$1@6067b682
scala> implicitly[Foo].t // implicitly loses precision
res0: Foo#T = 23
scala> implicitly[Foo].t+13
<console>:13: error: type mismatch;
found : Int(13)
required: String
implicitly[Foo].t+13
^
scala> the[Foo].t // the retains it
res1: Int = 23
scala> the[Foo].t+13
res2: Int = 36
Unlike implicitly, the can also be used in type position, thanks to a trick
due to Denys Shabalin (@den_sh) and Eugene Burmako (@xeno_by). Here we use a
combination of selectDynamic and backticks to embed a type in a path which
appears to the compiler as stable,
scala> val i: implicitly[Foo].T = 23// syntax error
<console>:1: error: ';' expected but '.' found.
val i: implicitly[Foo].T = 23
^
scala> val i: the.`Foo`.T = 23// OK
i: Int = 23
An enhanced alternative to
Predef.implicitly
.Used as a term
the[T]
yields the unique implicit value of typeT
in the current implicit scope, if any. It is a compile time error if there is no such value. Its primary advantage overPredef.implicitly
is that it will preserve any refinement that the implicit definition has, resulting in more precisely typed, and hence often more useful, values,Unlike
implicitly
,the
can also be used in type position, thanks to a trick due to Denys Shabalin (@den_sh) and Eugene Burmako (@xeno_by). Here we use a combination ofselectDynamic
and backticks to embed a type in a path which appears to the compiler as stable,