title: WeakTypeTag v. TypeTag
body: <p>In the REPL, I'm writing out the examples from <a href="http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html" rel="noreferrer">Reflection - TypeTags and Manifests</a>. </p>
  
  <p>I'm confused by the difference between <code>WeakTypeTag</code> and <code>TypeTag</code>.</p>
  
  <pre><code>scala&gt; import scala.reflect.runtime.universe._
  import scala.reflect.runtime.universe._
  </code></pre>
  
  <p><strong>TypeTag</strong></p>
  
  <pre><code>scala&gt; def paramInfo[T](x: T)(implicit tag: TypeTag[T]): Unit = {
       |   val targs = tag.tpe match {  case TypeRef(_, _, args) =&gt; args }
       |   println(s"type tag of $x has type arguments $targs")
       | }
  paramInfo: [T](x: T)(implicit tag: reflect.runtime.universe.TypeTag[T])Unit
  </code></pre>
  
  <p><strong>WeakTypeTag</strong></p>
  
  <pre><code>scala&gt; def weakParamInfo[T](x: T)(implicit tag: WeakTypeTag[T]): Unit = {
       |   val targs = tag.tpe match { case TypeRef(_, _, args) =&gt; args }
       |    println(s"type tag of $x has type arguments $targs")
       | }
  weakParamInfo: [T](x: T)(implicit tag: reflect.runtime.universe.WeakTypeTag[T])Unit
  </code></pre>
  
  <p><strong>Running a Simple, Non-exhaustive Example</strong></p>
  
  <pre><code>scala&gt; paramInfo2(List(1,2,3))
  type of List(1, 2, 3) has type arguments List(Int)
  
  scala&gt; weakParamInfo(List(1,2,3)
       | )
  type tag of List(1, 2, 3) has type arguments List(Int)
  </code></pre>
  
  <p>What's the difference between them?</p>