A Manifest[T] — это неявное описание типа T. Его использование позволяет получить доступ к стиранию типа в виде экземпляра Class, что необходимо для создания нативных Arrays , если класс неизвестен на этапе компиляции.
Операторы соотношений типов <:< и =:= следует рассматривать как приблизительные, так как во многих аспектах соответствия типов в манифестах пока не отражены адекватно.
Примеры использования:
def arr[T] = new Array[T](0) // does not compile
def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles
def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding
// Methods manifest and optManifest are in [[scala.Predef]].
def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U]
isApproxSubType[List[String], List[AnyRef]] // true
isApproxSubType[List[String], List[Int]] // false
def methods[T: Manifest] = manifest[T].runtimeClass.getMethods
def retType[T: Manifest](name: String) =
methods[T] find (_.getName == name) map (_.getGenericReturnType)
retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
ClassTag[T] может выступать в качестве экстрактора, который соответствует только объектам типа T.
Компилятор пытается преобразовать неконтролируемые проверки типов в совпадения шаблонов в контролируемые, обернув шаблон типа (_: T) в ct(_: T), где ct — экземпляр ClassTag[T]. Аналогично обрабатываются проверки типов, необходимые перед вызовом других экстракторов. SomeExtractor(...) преобразуется в ct(SomeExtractor(...)), если T в SomeExtractor.unapply(x: T) не проверяем, но у нас есть экземпляр ClassTag[T].