scala reflection-Mirrors,ClassTag,TypeTag and WeakTypeTag
|
ClassTag在scala.reflect.ClassTag里。这个extract函数的目的是把T类型的值过滤出来。上面的例子里list里的String元素被筛选出来了。但是如果我们像下面这样使用extract呢? 1 extract[List[Int]](List(List(1,2),List("a","b")))//> res5: List[List[Int]] = List(List(1, 2), List(a, b))
这次extract得出错误的运算结果,因为我们指明的是过滤List[Int]。这是因为ClassTag不支持高阶类型,List[Int]就是个高阶类型。那么extract[String]是怎样正确工作的呢?是因为compiler对模式匹配进行了这样的转换处理: case elem: T >>> case elem @tag(_:T) 通过ClassTag[T]隐式实例(implicit instance)可以正确推导出elem的类型。在上面的例子里我们通过ClassTag得出T就是String。分析得出ClassTag可以分辨基础类型但无法分辨像List[Int],List[String]这样的高阶类型。 TypeTag包含了完整的类型信息可以分辨List[Int],List[String],甚至List[Set[Int]],List[Set[String]]这样的高阶类型。也就是TypeTag结构内包含了高阶类型内包嵌的类型,只有如此才能解决类型擦拭(type erasure)问题。我们用下面的例子来示范TypeTag的内容: 1 def getInnerType[T: ru.TypeTag](obj: T) = ru.typeTag[T].tpe match {
2 case ru.TypeRef(utype,usymb,args) =>
3 List(utype,usymb,args).mkString("n")
4 } //> getInnerType: [T](obj: T)(implicit evidence$4: worksheets.reflect.ru.TypeTag[T])String
5 getInnerType(List(1,2)) //> res6: String = scala.collection.immutable.type
6 //| class List
7 //| List(Int)
8 getInnerType(List(List(1,2))) //> res7: String = scala.collection.immutable.type
9 //| class List
10 //| List(List[Int])
11 getInnerType(Set(List(1,2))) //> res8: String = scala.collection.immutable.type
12 //| trait Set
13 //| List(List[Int])
14 getInnerType(List(Set("a","b"))) //> res9: String = scala.collection.immutable.type
15 //| class List
16 //| List(scala.collection.immutable.Set[java.lang.String])
上面的例子里getInnerType可以分辨高阶类型内的类型,args就是承载这个内部类型的List。那么如果我们为extract函数提供一个TypeTag又如何呢?看看下面的示范: 1 def extract[T: ru.TypeTag](list: List[Any]) = list.flatMap {
2 case elem: T => Some(elem)
3 case _ => None
4 } //> extract: [T](list: List[Any])(implicit evidence$3: ru.TypeTag[T])List[T]
5 extract[String](List(1,"One",2,3,"Four",List(5)))//> res4: List[String] = List(1, One, 2, 3, Four, List(5))
6 extract[List[Int]](List(List(1,2),List("a","b")))//> res5: List[List[Int]] = List(List(1, 2), List(a, b))
(编辑:网站开发网_安阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

