Scala中ClassTag 、Manifest、ClassManifest、TypeTag的關係

在Scala中應用了大量的數組,按照Scala的語法來說是不能創建泛型數組,因爲Scala編譯時必須要確定它的類型,否則編譯都不能通過,但是Scala中引入了Manifest,Manifest可以有效解決這個問題
如下圖:





注:如上圖中:
當調用方法傳遞參數執行時,ClassTag會把參數類型記住,其實ClassTag就是隱式值,將類型傳遞給T,這就是隱式轉換最重要的工作

Manifest(上下文界定)特點:
1、Array在Scala中是一個原生的數組,所以編譯時並不會有過多的輔助的處理
2、通過Manifest可以創建Array泛型類型的創建,即可以幫助Array提供確認泛型的類型(這就是隱式值)
3、Manifest會存儲運行時實際的類型,然後運行時作爲參數傳遞
4、泛型類型在運行時具體的類型是看不到的,被抹掉了
5、隱式是一個難點、重點,隱式是自動判斷類型,且進行傳遞的一個過程

ClassManifest:
和Manifest具有相同的作用,但是獲取信息方面比Manifest弱一些

ClassTag :
1、在Spark中的實際編碼中ClassTag用的比較頻繁,在隱式轉換中具有非常重要的作用
2、ClassTag最重要的也是指定在運行時泛型的類型(編譯時無法識別的type)


綜合比較:
1、Manifest有一些弱點,在判斷指定路徑方面的class的類型時會出現有誤,所以用ClassTag代替Manifest,用TypeTag代替ClassManifest
2、TypeTag要比ClassTag更加強大(在實際應用中ClassTag更加廣泛)
3、所有在JVM上運行的泛型的類型是被抹掉的,虛擬機根本不知道是什麼類型
4、在實際的開發中經常使用上面截圖中的第一種方式應用泛型類,但在實際的編譯中會形成第二種的方式運行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章