加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

scala reflection-Mirrors,ClassTag,TypeTag and WeakTypeTag

发布时间:2016-10-28 22:09:54 所属栏目:教程 来源:站长网
导读:副标题#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)根本无法通过编译。

 

 

 

 

 

 

 

 

 

 

 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读