Scala _09样例类(case classes)隐式转换
樣例類(case classes)
- 概念理解
使用了case關鍵字的類定義就是樣例類(case classes),樣例類是種特殊的類。實現了類構造參數的getter方法(構造參數默認被聲明為val),當構造參數是聲明為var類型的,它將幫你實現setter和getter方法。
- 例子:結合模式匹配的代碼
隱式轉換
隱式轉換是在Scala編譯器進行類型匹配時,如果找不到合適的類型,那么隱式轉換會讓編譯器在作用范圍內自動推導出來合適的類型。
- 隱式值與隱式參數
隱式值是指在定義參數時前面加上implicit。隱式參數是指在定義方法時,方法中的部分參數是由implicit修飾【必須使用柯里化的方式,將隱式參數寫在后面的括號中】。隱式轉換作用就是:當調用方法時,不必手動傳入方法中的隱式參數,Scala會自動在作用域范圍內尋找隱式值自動傳入。
隱式值和隱式參數注意:
1). 同類型的參數的隱式值只能在作用域內出現一次,同一個作用域內不能定義多個類型一樣的隱式值。
? ? ? 2). implicit 關鍵字必須放在隱式參數定義的開頭
? ? ? 3). 一個方法只有一個參數是隱式轉換參數時,那么可以直接定義implicit關鍵字修飾的參數,調用時直接創建類型不傳入參數即可。
4). 一個方法如果有多個參數,要實現部分參數的隱式轉換,必須使用柯里化這種方式,隱式關鍵字出現在后面,只能出現一次
package com.henu.scala12caseclassesAndimplicitobject ImpliciScalaDemo {def Student(age:Int)(implicit name:String,i:Int)={println(s"student : $name , age = $age, score = $i")}def Teacher(implicit name:String): Unit ={println(s"teacher name is : $name")}def main(args: Array[String]): Unit = {implicit val dd = "george"implicit val ddd = 100Student(22)Teacher} }- 隱式轉換函數
隱式轉換函數是使用關鍵字implicit修飾的方法。當Scala運行時,假設如果A類型變量調用了method()這個方法,發現A類型的變量沒有method()方法,而B類型有此method()方法,會在作用域中尋找有沒有隱式轉換函數將A類型轉換成B類型,如果有隱式轉換函數,那么A類型就可以調用method()這個方法。
隱式轉換函數注意:隱式轉換函數只與函數的參數類型和返回類型有關,與函數名稱無關,所以作用域內不能有相同的參數類型和返回類型的不同名稱隱式轉換函數。
package com.henu.scala12caseclassesAndimplicitobject ImpliciFunDemo {implicit def rabbitToAnimal(rabbit: Rabbit):Animal = {new Animal(rabbit.name)}def main(args: Array[String]): Unit = {val rabbit = new Rabbit("george")rabbit.canFly()} } class Animal(name:String){def canFly() ={println(s"$name can fly!")} } class Rabbit(xname:String){val name = xname }- 隱式類
使用implicit關鍵字修飾的類就是隱式類。若一個變量A沒有某些方法或者某些變量時,而這個變量A可以調用某些方法或者某些變量時,可以定義一個隱式類,隱式類中定義這些方法或者變量,隱式類中傳入A即可。
隱式類注意:
? ?1).隱式類必須定義在類,包對象,伴生對象中。
2).隱式類的構造必須只有一個參數,同一個類,包對象,伴生對象中不能出現同類型構造的隱式類。
package com.henu.scala12caseclassesAndimplicitclass Rabbit(s:String){val name = s }object ImplicitClass {implicit class Animal(rabbit: Rabbit){val tp = "Animal"def canFly() = {println(rabbit.name + " can fly...")}}def main(args: Array[String]): Unit = {val rabbit = new Rabbit("rabbit")rabbit.canFly()println(rabbit.tp)} }?
總結
以上是生活随笔為你收集整理的Scala _09样例类(case classes)隐式转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala _07trait特性
- 下一篇: 日跑几十万作业,唯品会HDFS是如何优化