ClassTag、Manifest、ClassManifest、TypeTag

541732025發表於2016-01-07

點選(此處)摺疊或開啟

  1. def main(args: Array[String]) {
  2.    
  3.     //從理論上講,建立一個泛型Array是不可能的,但是可以藉助Manifest實現
  4.     //用Manifest[T]的隱式值,儲存執行時T的資訊,在實際執行時,作為一個引數作用在方法執行的上下文中
  5.     def arrayMake[T : Manifest](first : T, second : T) = {
  6.       val r = new Array[T](2); r(0) = first; r(1) = second; r
  7.     }
  8.    arrayMake(1,2).foreach(println)
  9.   
  10.     
  11.    def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
  12.    mkArray(42, 13).foreach(println)
  13.    mkArray("Japan","Brazil","Germany").foreach(println)
  14.     
  15.     def manif[T](x: List[T])(implicit m: Manifest[T]) = {//原生寫法,隱式引數
  16.      if (m <:< manifest[String])
  17.      println("List strings")
  18.      else
  19.      println("Some other type")
  20.     }

  21.     manif(List("Spark", "Hadoop")) //執行時,會傳入Manifest[String]隱式值
  22.     manif(List(1, 2))
  23.     manif(List("Scala", 3))
  24.     
  25.     val m = manifest[A[String]]
  26.     println(m)
  27.     val cm = classManifest[A[String]]
  28.     println(cm)
  29.   }
由於Manifest在依賴路徑判斷上存在問題,所以,Scala推出來ClassTag、TypeTag用來取代Manifest、classManifest
在Spark中使用最多的就是ClassTag,ClassTag原始碼註釋:
 * A `ClassTag[T]` stores the erased class of a given type `T`, accessible via the `runtimeClass`
 * field. This is particularly useful for instantiating `Array`s whose element types are unknown
 * at compile time.
  * ClassTag儲存T被擦出的class資訊,在不知道元素型別而初始化Array時特別有用
  *
 * `ClassTag`s are a weaker special case of [[scala.reflect.api.TypeTags#TypeTag]]s, in that they
 * wrap only the runtime class of a given type, whereas a `TypeTag` contains all static type
 * information. That is, `ClassTag`s are constructed from knowing only the top-level class of a
 * type, without necessarily knowing all of its argument types. This runtime information is enough
 * for runtime `Array` creation.
  * ClassTag比TypeTag弱,它只包含執行時class資訊,TypeTag包含所有static型別資訊

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1973327/,如需轉載,請註明出處,否則將追究法律責任。

相關文章