【scala关键字系列】TypeTags Manifests
文章目录
在Scala中,类型在运行时被擦除,这意味着如果你检查某个实例的运行时类型,可能无法获取编译时Scala编译器可用的所有类型信息。
与scala.reflect.Manifest类似,**TypeTags可以看作是将所有可用的类型信息从编译时传递到运行时的对象。**例如,TypeTag[T]封装了某个编译时类型T的运行时类型表示。需要注意的是,TypeTags应该被视为2.10之前Manifest的更丰富的替代品,并且与Scala反射完全集成。
存在三种不同类型的TypeTags:
-
scala.reflect.api.TypeTags#TypeTag:Scala类型的完整类型描述符。例如,TypeTag[List[String]]包含了List[String]类型的所有类型信息。 -
scala.reflect.ClassTag:Scala类型的部分类型描述符。例如,ClassTag[List[String]]仅包含已擦除的类类型信息,即scala.collection.immutable.List。ClassTags只提供对类型的运行时类的访问。类似于scala.reflect.ClassManifest。 -
scala.reflect.api.TypeTags#WeakTypeTag:抽象类型的类型描述符(请参见下面的相应小节)。
获取TypeTag
与Manifests一样,TypeTags始终由编译器生成,并且可以通过三种方式获得。
1. 通过typeTag、classTag或weakTypeTag方法
可以通过Universe上可用的typeTag方法直接获得特定类型的TypeTag。
例如,要获得表示Int的TypeTag,可以这样做:
import scala.reflect.runtime.universe._
val tt = typeTag[Int]
同样地,要获得表示String的ClassTag,可以这样做:
import scala.reflect._
val ct = classTag[String]
每个方法都构造了一个TypeTag[T]或ClassTag[T],其中T为给定的类型参数。
2. 使用隐式参数TypeTag[T]、ClassTag[T]或WeakTypeTag[T]
与Manifests类似,可以在方法或类中指定一个隐式证据参数,以请求编译器生成TypeTag。只需将类型参数列表中的一个隐式参数的类型设为TypeTag[T]。如果编译器在隐式搜索期间找不到匹配的隐式值,它将自动生成一个TypeTag[T]。
注意:这通常只能在方法和类上使用隐式参数。
例如,我们可以编写一个方法,该方法接受任意对象,并使用TypeTag打印有关该对象类型参数的信息:
import scala.reflect.runtime.universe

本文介绍了Scala中的TypeTags和Manifests概念,重点讲解了如何通过typeTag、classTag、weakTypeTag获取类型标签,以及使用隐式参数和上下文边界获取类型信息。同时提到了WeakTypeTags的特点以及TypeTags与Manifests之间的关系和替代性。
最低0.47元/天 解锁文章
316

被折叠的 条评论
为什么被折叠?



