scala中的Mainfest上下文界定和ClassTag(轉)

1> Mainfest上下文界定

  1. 在Scala中數組必須是有類型的,如果直接是泛型的話將會報錯,這時候引入了Manifest上下文界定,需要一個Mainfest[T]對象,而mainifest[T]有一個隱式值,
  2. 如果調用makePair(1,2),編譯器將定位到隱式的Manifst[Int]並實際上調用makePair(2,3)(intManifest),該方法調用的就是new Array(2)(intManifest),返回的基本類型的數組int[2]
  3. 在new ArrayT會創建一個隱式的manifest類型
  4. 爲啥要搞Manifest? 因爲array在創建的時候,編譯器僅僅只是創建,並沒有指定類型。
    這裏寫圖片描述

2> ClassTag

  1. 源碼中的解釋,在泛型中,type T是被擦除的。這個是非常有用的,在我們構建數組的時候,但是數組的類型我們也不知道,編譯的時候不知道,但是運行的時候要知道,ClassTag只包含實際運行時的類的類型。
    這裏寫圖片描述
  2. ClassTag會幫我們存儲T的信息,如下面,傳入1,2根據類型推到可以指定T是Int類型,這時候ClassTag就可以把Int類型這個信息傳遞給編譯器。ClassTag運行時指定在編譯的時候無法指定的類型信息。
    這裏寫圖片描述
  3. 不需要寫這樣寫,implicit m : Manifest[T]
    這裏寫圖片描述
    如下代碼可以看到,編譯器會幫我們翻譯成implicit,因爲ClassTag中間有隱式參數和隱式值,因爲我們沒有必要這樣去寫,直接ClassTag就行了。
    這裏寫圖片描述
    後記:
    從別人轉發那轉發過來的,原文作者不知道是誰了,若有侵權,麻煩作者聯繫我~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章