WeakTypeTag v. TypeTag

In REPL, I write examples from Reflection - TypeTags and Manifests .

I am confused by the difference between WeakTypeTag and TypeTag .

 scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ 

TypeTag

 scala> def paramInfo[T](x: T)(implicit tag: TypeTag[T]): Unit = { | val targs = tag.tpe match { case TypeRef(_, _, args) => args } | println(s"type tag of $x has type arguments $targs") | } paramInfo: [T](x: T)(implicit tag: reflect.runtime.universe.TypeTag[T])Unit 

WeakTypeTag

 scala> def weakParamInfo[T](x: T)(implicit tag: WeakTypeTag[T]): Unit = { | val targs = tag.tpe match { case TypeRef(_, _, args) => args } | println(s"type tag of $x has type arguments $targs") | } weakParamInfo: [T](x: T)(implicit tag: reflect.runtime.universe.WeakTypeTag[T])Unit 

Executing a simple, non-exhaustive example

 scala> paramInfo2(List(1,2,3)) type of List(1, 2, 3) has type arguments List(Int) scala> weakParamInfo(List(1,2,3) | ) type tag of List(1, 2, 3) has type arguments List(Int) 

What is the difference between the two?

+7
scala
source share
1 answer

TypeTag ensures that you have a specific type (i.e. one that does not contain any type parameters or elements of an abstract type); WeakTypeTag does not work.

 scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> def foo[T] = typeTag[T] <console>:10: error: No TypeTag available for T def foo[T] = typeTag[T] ^ scala> def foo[T] = weakTypeTag[T] foo: [T]=> reflect.runtime.universe.WeakTypeTag[T] 

But, of course, it cannot actually get you the general parameters called by the method when used as follows:

 scala> foo[Int] res0: reflect.runtime.universe.WeakTypeTag[Int] = WeakTypeTag[T] 

You can only create a TypeTag generic type if you have a TypeTag for all parameters:

 scala> def foo[T: TypeTag] = typeTag[List[T]] foo: [T](implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.TypeTag[List[T]] 

If you have a WeakTypeTag specific type, it should behave the same as a TypeTag (as far as I know).

+9
source share

All Articles