scala reflection-Mirrors,ClassTag,TypeTag and WeakTypeTag
发布时间:2016-10-29 12:10:59 所属栏目:教程 来源:站长网
导读:副标题#e# 反射reflection是程序对自身的检查、验证甚至代码修改功能。反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class)、方法(method)、表达式(expression)等。或者动态跟踪当前程序运算事件如:方法运算(method invocati
结果与使用TypeTag一致,好像WeakTypeTag和TypeTag没什么分别。从字面解释,WeakTypeTag应该在某些方面要求比较松。在上面的例子里调用meth函数时我们提供了一个实质类型如:List[Int],List[String],List[List[Int]]等。如果我们只能提供像List[T]这样的抽象类型的话,compiler一定会吵闹,像下面的示范: 1 // def foo[T] = ru.typeTag[T] //> No TypeTag available for T 2 def foo[T] = ru.weakTypeTag[T] //> foo: [T]=> worksheets.reflect.ru.WeakTypeTag[T] 看来WeakTypeTag可以支持抽象类型。我们再看看下面的示范: 1 abstract class SomeClass[T] { 2 def getInnerWeakType[T: ru.WeakTypeTag](obj: T) = ru.weakTypeTag[T].tpe match { 3 case ru.TypeRef(utype,usymb,args) => 4 List(utype,usymb,args).mkString("n") 5 } 6 val list: List[T] 7 val result = getInnerWeakType(list) 8 } 9 val sc = new SomeClass[Int] { val list = List(1,2,3) } 10 //> sc : SomeClass[Int] 11 println(sc.result) //> scala.type 12 //| type List 13 //| List(T) 首先我们可以得出List[T]的内部类型就是T。更重要的是如果不使用WeakTypeTag的话getInnerWeakType(list)根本无法通过编译。
(编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |