Scala Library: scala.reflect.ClassTag
scala.reflect.ClassTag
trait ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with SerializableA ClassTag[T] stores the erased class of a given type T , accessible via the
 runtimeClass field. This is particularly useful for instantiating Array s
whose element types are unknown at compile time.
ClassTag s are a weaker special case of scala.reflect.api.TypeTags#TypeTag s,
in that they wrap only the runtime class of a given type, whereas a TypeTag
contains all static type information. That is, ClassTag s are constructed from
knowing only the top-level class of a type, without necessarily knowing all of
its argument types. This runtime information is enough for runtime Array
creation.
For example:
scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> mkArray(42, 13)
res0: Array[Int] = Array(42, 13)
scala> mkArray("Japan","Brazil","Germany")
res1: Array[String] = Array(Japan, Brazil, Germany)See scala.reflect.api.TypeTags for more examples, or the Reflection Guide: TypeTags for more details.
- Annotations
    
- @ implicitNotFound (msg = “No ClassTag available for ${T}”)
 
 - Source
 
Concrete Value Members From scala.reflect.ClassManifestDeprecatedApis
def arrayClass[T](tp: Class[_]): Class[Array[T]]
- Attributes
    
- protected
 
 - Definition Classes
    
- ClassManifestDeprecatedApis
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
Deprecated Value Members From scala.reflect.ClassManifestDeprecatedApis
def <:<(that: ClassManifest[_]): Boolean
Tests whether the type represented by this manifest is a subtype of the type
represented by that manifest, subject to the limitations described in the
header.
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def >:>(that: ClassManifest[_]): Boolean
Tests whether the type represented by this manifest is a supertype of the type
represented by that manifest, subject to the limitations described in the
header.
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def arrayManifest: ClassManifest[Array[T]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use wrap instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newArray2(len: Int): Array[Array[T]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use wrap.newArray instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newArray3(len: Int): Array[Array[Array[T]]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use wrap.wrap.newArray instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newArray4(len: Int): Array[Array[Array[Array[T]]]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use wrap.wrap.wrap.newArray instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newArray5(len: Int): Array[Array[Array[Array[Array[T]]]]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use wrap.wrap.wrap.wrap.newArray instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newArrayBuilder(): ArrayBuilder[T]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use ArrayBuilder.make(this) instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def newWrappedArray(len: Int): WrappedArray[T]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Create WrappedArray directly instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
def typeArguments: List[OptManifest[_]]
- Definition Classes
    
- ClassManifestDeprecatedApis
 
 - Annotations
    
- @ deprecated
 
 - Deprecated
    
- (Since version 2.10.0) Use scala.reflect.runtime.universe.TypeTag to capture type structure instead
 
 
(defined at scala.reflect.ClassManifestDeprecatedApis)
Concrete Value Members From scala.reflect.ClassTag
def canEqual(x: Any): Boolean
A method that should be called from every well-designed equals method that is open to be overridden in a subclass. See Programming in Scala, Chapter 28 for discussion and design.
- returns
    
- true if this instance can possibly equal 
that, otherwise false 
 - true if this instance can possibly equal 
 - Definition Classes
    
- ClassTag → Equals → ClassManifestDeprecatedApis
 
 
(defined at scala.reflect.ClassTag)
def equals(x: Any): Boolean
The universal equality method defined in AnyRef .
- Definition Classes
    
- ClassTag → Equals → AnyRef → Any
 
 
(defined at scala.reflect.ClassTag)
def newArray(len: Int): Array[T]
Produces a new array with element type T and length len
- Definition Classes
    
- ClassTag → ClassManifestDeprecatedApis
 
 
(defined at scala.reflect.ClassTag)
def unapply(x: Any): Option[T]
A ClassTag[T] can serve as an extractor that matches only objects of type T.
The compiler tries to turn unchecked type tests in pattern matches into checked
ones by wrapping a (_: T) type pattern as ct(_: T) , where ct is the
 ClassTag[T] instance. Type tests necessary before calling other extractors
are treated similarly. SomeExtractor(...) is turned into
 ct(SomeExtractor(...)) if T in SomeExtractor.unapply(x: T) is
uncheckable, but we have an instance of ClassTag[T] .
(defined at scala.reflect.ClassTag)
def unapply(x: Boolean): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Byte): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Char): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Double): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Float): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Int): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Long): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Short): Option[T]
(defined at scala.reflect.ClassTag)
def unapply(x: Unit): Option[T]
(defined at scala.reflect.ClassTag)
def wrap: ClassTag[Array[T]]
Produces a ClassTag that knows how to instantiate an Array[Array[T]]
(defined at scala.reflect.ClassTag)
Deprecated Value Members From scala.reflect.ClassTag
abstract def runtimeClass: Class[_]
A class representing the type U to which T would be erased. Note that there
is no subtyping relationship between T and U .
(defined at scala.reflect.ClassTag)
Full Source:
package scala
package reflect
import java.lang.{ Class => jClass }
import scala.runtime.ScalaRunTime.arrayElementClass
/**
 *
 * A `ClassTag[T]` stores the erased class of a given type `T`, accessible via the `runtimeClass`
 * field. This is particularly useful for instantiating `Array`s whose element types are unknown
 * at compile time.
 *
 * `ClassTag`s are a weaker special case of [[scala.reflect.api.TypeTags#TypeTag]]s, in that they
 * wrap only the runtime class of a given type, whereas a `TypeTag` contains all static type
 * information. That is, `ClassTag`s are constructed from knowing only the top-level class of a
 * type, without necessarily knowing all of its argument types. This runtime information is enough
 * for runtime `Array` creation.
 *
 * For example:
 * {{{
 *   scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
 *   mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
 *
 *   scala> mkArray(42, 13)
 *   res0: Array[Int] = Array(42, 13)
 *
 *   scala> mkArray("Japan","Brazil","Germany")
 *   res1: Array[String] = Array(Japan, Brazil, Germany)
 * }}}
 *
 * See [[scala.reflect.api.TypeTags]] for more examples, or the
 * [[http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html Reflection Guide: TypeTags]]
 * for more details.
 *
 */
@scala.annotation.implicitNotFound(msg = "No ClassTag available for ${T}")
trait ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with Serializable {
  // please, don't add any APIs here, like it was with `newWrappedArray` and `newArrayBuilder`
  // class tags, and all tags in general, should be as minimalistic as possible
  /** A class representing the type `U` to which `T` would be erased.
   *  Note that there is no subtyping relationship between `T` and `U`.
   */
  def runtimeClass: jClass[_]
  /** Produces a `ClassTag` that knows how to instantiate an `Array[Array[T]]` */
  def wrap: ClassTag[Array[T]] = ClassTag[Array[T]](arrayClass(runtimeClass))
  /** Produces a new array with element type `T` and length `len` */
  override def newArray(len: Int): Array[T] =
    runtimeClass match {
      case java.lang.Byte.TYPE      => new Array[Byte](len).asInstanceOf[Array[T]]
      case java.lang.Short.TYPE     => new Array[Short](len).asInstanceOf[Array[T]]
      case java.lang.Character.TYPE => new Array[Char](len).asInstanceOf[Array[T]]
      case java.lang.Integer.TYPE   => new Array[Int](len).asInstanceOf[Array[T]]
      case java.lang.Long.TYPE      => new Array[Long](len).asInstanceOf[Array[T]]
      case java.lang.Float.TYPE     => new Array[Float](len).asInstanceOf[Array[T]]
      case java.lang.Double.TYPE    => new Array[Double](len).asInstanceOf[Array[T]]
      case java.lang.Boolean.TYPE   => new Array[Boolean](len).asInstanceOf[Array[T]]
      case java.lang.Void.TYPE      => new Array[Unit](len).asInstanceOf[Array[T]]
      case _                        => java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]]
    }
  /** A ClassTag[T] can serve as an extractor that matches only objects of type T.
   *
   * The compiler tries to turn unchecked type tests in pattern matches into checked ones
   * by wrapping a `(_: T)` type pattern as `ct(_: T)`, where `ct` is the `ClassTag[T]` instance.
   * Type tests necessary before calling other extractors are treated similarly.
   * `SomeExtractor(...)` is turned into `ct(SomeExtractor(...))` if `T` in `SomeExtractor.unapply(x: T)`
   * is uncheckable, but we have an instance of `ClassTag[T]`.
   */
  def unapply(x: Any): Option[T] =
    if (null != x && (
            (runtimeClass.isInstance(x))
         || (x.isInstanceOf[Byte]    && runtimeClass.isAssignableFrom(classOf[Byte]))
         || (x.isInstanceOf[Short]   && runtimeClass.isAssignableFrom(classOf[Short]))
         || (x.isInstanceOf[Char]    && runtimeClass.isAssignableFrom(classOf[Char]))
         || (x.isInstanceOf[Int]     && runtimeClass.isAssignableFrom(classOf[Int]))
         || (x.isInstanceOf[Long]    && runtimeClass.isAssignableFrom(classOf[Long]))
         || (x.isInstanceOf[Float]   && runtimeClass.isAssignableFrom(classOf[Float]))
         || (x.isInstanceOf[Double]  && runtimeClass.isAssignableFrom(classOf[Double]))
         || (x.isInstanceOf[Boolean] && runtimeClass.isAssignableFrom(classOf[Boolean]))
         || (x.isInstanceOf[Unit]    && runtimeClass.isAssignableFrom(classOf[Unit])))
       ) Some(x.asInstanceOf[T])
    else None
  // TODO: deprecate overloads in 2.12.0, remove in 2.13.0
  def unapply(x: Byte)    : Option[T] = unapplyImpl(x, classOf[Byte])
  def unapply(x: Short)   : Option[T] = unapplyImpl(x, classOf[Short])
  def unapply(x: Char)    : Option[T] = unapplyImpl(x, classOf[Char])
  def unapply(x: Int)     : Option[T] = unapplyImpl(x, classOf[Int])
  def unapply(x: Long)    : Option[T] = unapplyImpl(x, classOf[Long])
  def unapply(x: Float)   : Option[T] = unapplyImpl(x, classOf[Float])
  def unapply(x: Double)  : Option[T] = unapplyImpl(x, classOf[Double])
  def unapply(x: Boolean) : Option[T] = unapplyImpl(x, classOf[Boolean])
  def unapply(x: Unit)    : Option[T] = unapplyImpl(x, classOf[Unit])
  private[this] def unapplyImpl(x: Any, primitiveCls: java.lang.Class[_]): Option[T] =
    if (runtimeClass.isInstance(x) || runtimeClass.isAssignableFrom(primitiveCls)) Some(x.asInstanceOf[T])
    else None
  // case class accessories
  override def canEqual(x: Any) = x.isInstanceOf[ClassTag[_]]
  override def equals(x: Any) = x.isInstanceOf[ClassTag[_]] && this.runtimeClass == x.asInstanceOf[ClassTag[_]].runtimeClass
  override def hashCode = scala.runtime.ScalaRunTime.hash(runtimeClass)
  override def toString = {
    def prettyprint(clazz: jClass[_]): String =
      if (clazz.isArray) s"Array[${prettyprint(arrayElementClass(clazz))}]" else
      clazz.getName
    prettyprint(runtimeClass)
  }
}
/**
 * Class tags corresponding to primitive types and constructor/extractor for ClassTags.
 */
object ClassTag {
  private val ObjectTYPE = classOf[java.lang.Object]
  private val NothingTYPE = classOf[scala.runtime.Nothing$]
  private val NullTYPE = classOf[scala.runtime.Null$]
  val Byte    : ClassTag[scala.Byte]       = Manifest.Byte
  val Short   : ClassTag[scala.Short]      = Manifest.Short
  val Char    : ClassTag[scala.Char]       = Manifest.Char
  val Int     : ClassTag[scala.Int]        = Manifest.Int
  val Long    : ClassTag[scala.Long]       = Manifest.Long
  val Float   : ClassTag[scala.Float]      = Manifest.Float
  val Double  : ClassTag[scala.Double]     = Manifest.Double
  val Boolean : ClassTag[scala.Boolean]    = Manifest.Boolean
  val Unit    : ClassTag[scala.Unit]       = Manifest.Unit
  val Any     : ClassTag[scala.Any]        = Manifest.Any
  val Object  : ClassTag[java.lang.Object] = Manifest.Object
  val AnyVal  : ClassTag[scala.AnyVal]     = Manifest.AnyVal
  val AnyRef  : ClassTag[scala.AnyRef]     = Manifest.AnyRef
  val Nothing : ClassTag[scala.Nothing]    = Manifest.Nothing
  val Null    : ClassTag[scala.Null]       = Manifest.Null
  def apply[T](runtimeClass1: jClass[_]): ClassTag[T] =
    runtimeClass1 match {
      case java.lang.Byte.TYPE      => ClassTag.Byte.asInstanceOf[ClassTag[T]]
      case java.lang.Short.TYPE     => ClassTag.Short.asInstanceOf[ClassTag[T]]
      case java.lang.Character.TYPE => ClassTag.Char.asInstanceOf[ClassTag[T]]
      case java.lang.Integer.TYPE   => ClassTag.Int.asInstanceOf[ClassTag[T]]
      case java.lang.Long.TYPE      => ClassTag.Long.asInstanceOf[ClassTag[T]]
      case java.lang.Float.TYPE     => ClassTag.Float.asInstanceOf[ClassTag[T]]
      case java.lang.Double.TYPE    => ClassTag.Double.asInstanceOf[ClassTag[T]]
      case java.lang.Boolean.TYPE   => ClassTag.Boolean.asInstanceOf[ClassTag[T]]
      case java.lang.Void.TYPE      => ClassTag.Unit.asInstanceOf[ClassTag[T]]
      case ObjectTYPE               => ClassTag.Object.asInstanceOf[ClassTag[T]]
      case NothingTYPE              => ClassTag.Nothing.asInstanceOf[ClassTag[T]]
      case NullTYPE                 => ClassTag.Null.asInstanceOf[ClassTag[T]]
      case _                        => new ClassTag[T]{ def runtimeClass = runtimeClass1 }
    }
  def unapply[T](ctag: ClassTag[T]): Option[Class[_]] = Some(ctag.runtimeClass)
}Interested in Scala?
I send out weekly, personalized emails with articles and conference talks.
Subscribe now.