ClassTag、Manifest

来源:互联网 发布:改号软件 编辑:程序博客网 时间:2024/06/03 06:55

》Manifest

Manifest是scala2.8引入的一个特质,用于编译器在运行时也能获取泛型类型的信息。
在JVM上,泛型参数类型T在运行时是被“擦拭”掉的,编译器把T当作Object来对待,
所以T的具体信息是无法得到的;为了使得在运行时得到T的信息,
scala需要额外通过Manifest来存储T的信息,并作为参数用在方法的运行时上下文。

》ClassTag

源码中的解释,在泛型中,type T是被擦除的。这个是非常有用的(??具体还要去追究下有什么用),在我们构建数组的时候,但是数组的类型我们也不知道,编译的时候不知道,但是运行的时候要知道,ClassTag只包含实际运行时的类的类型。

ClassTag会帮我们存储T的信息,如下面,根据类型推导可以指定T是Int类型,这时候ClassTag就可以把Int类型这个信息传递给编译器。ClassTag运行时指定在编译的时候无法指定的类型信息。

scala > def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]scala> mkArray(42,13)res0: Array[Int] = Array(42,13)
阅读全文
0 0
原创粉丝点击