今天知識星球球友,微信問浪尖了一個spark源碼閱讀中的類型限定問題。這個在spark源碼很多處出現,所以今天浪尖就整理一下scala類型限定的內容。希望對大家有幫助。
scala類型參數要點
1. 非變
trait Queue[T] {}?
這是非變情況。這種情況下,當類型S是類型A的子類型,則Queue[S]不可認為是Queue[A]的子類型或父類型,這種情況是和Java一樣的。?
2. 協變
trait Queue[+T] {}?
這是協變情況。這種情況下,當類型S是類型A的子類型,則Queue[S]也可以認為是Queue[A}的子類型,即Queue[S]可以泛化為Queue[A]。也就是被參數化類型的泛化方向與參數類型的方向是一致的,所以稱為協變。?
3. 逆變
trait Queue[-T] {}?
這是逆變情況。這種情況下,當類型S是類型A的子類型,則Queue[A]反過來可以認為是Queue[S}的子類型。也就是被參數化類型的泛化方向與參數類型的方向是相反的,所以稱為逆變。?
4. 類型下界
U >: T
這是類型下界的定義,也就是U必須是類型T的父類(或本身,自己也可以認為是自己的父類)。
5. 類型上屆
S <: T
這是類型上界的定義,也就是S必須是類型T的子類(或本身,自己也可以認為是自己的子類)。
泛型與約束實戰
1?泛型函數
ClassTag[T]保存了泛型擦除后的原始類型T,提供給被運行時的。
2?類型變量界定
泛型參數類型限定,限定具體類的可以調用特定的方法。
3?泛型視圖限定
泛型視圖限定:表示把傳入不是Comparable[T]類型的隱式傳換為Comparable[T]類型,Comparable[T]:為T下界,T:為Comparable[T]上界。
4?上下文界定
上下文界定:上下文界定是隱式參數的語法糖。如:Ordering:可以進行隱式轉化的T類型。
Manifest關鍵字:數組在聲明時必須要求指定具體的類型,在函數泛型是無法知道具體類型,英語詞性通過Manifest關鍵字使得運行時可以根據這個Manifest參數做更多的事情。
6?ClassTag關鍵字
ClassTag[T]保存了泛型擦除后的原始類型T,提供給被運行時的。
在引入Manifest的時候,還引入了一個更弱一點的ClassManifest,所謂的弱是指類型信息不如Manifest那么完整。用TypeTag替代了Manifest,用ClassTag替代了ClassManifest,原因是在路徑依賴類型中,Manifest存在問題。
更多scala,spark,大數據知識,希望擴展視野解決疑難雜症及困惑,歡迎點擊閱讀原文,加入浪尖知識星球。
本文整理自網絡,若有侵權,請聯系微信158570986刪除。
推薦閱讀:
Scala語法基礎之隱式轉換
Scala語言基礎之結合demo和spark講實現鏈式計算
文章來源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/81916961