48.Scala類型約束代碼實戰及其在Spark中的應用源碼解析


   A =:= B //表示A類型等同於B類型
   A <:< B  //表示A類型是B類型的子類型


def main(args: Array[String]): Unit = {

    
    def rocky[T](i : T)(implicit ev : T <:< java.io.Serializable) {  //傳入隱式參數,規定T必須是Serializable的子類型
      println("Life is short, you need Spark!")
    }
    
    rocky("Spark")  //運行時,推斷出“Spark”是String類型的,傳入隱式參數,發現T,String是Serializable類型的
    
   // rocky(100)  //報錯,Can not prove that Int <:< java.io.Serializable. 這就實現了對傳入的參數類型的限定
  }
}

源碼:

  sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
  private[this] final val singleton_<:< = new <:<[Any,Any] { def apply(x: Any): Any = x }

參考資料來源於大數據夢工廠 深入淺出scala 第48講 由王家林老師講解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章