1 定義
隱式類指的是用implicit關鍵字修飾的類。在對應的作用域內,帶有這個關鍵字的類的主構造函數可用于隱式轉換。
2示例
現在有一個需求:有一個 Person 類,含有work()方法,有一個 Student 類,含有study()方法,在不使用繼承的情況下,要求創建一個Person類的對象,可以直接調用Student類里的study()方法?
方法①: 使用 隱式類 ,將Student類定義為隱式類,這樣在 new Person對象的時候, 編譯器會默認在Student的主構造方法中傳入Person對象,再轉型為Student對象,這樣新建的Person對象就有了雙重身份,可以隨便調用這兩個類中的方法
代碼如下:
創建一個scala class文件: Person
?class Person() {? ?
? def work()={
? ? println("人每天都要工作")
? }
}
object Test1{
?implicit class Student(obj:Person){? ?
? ?def study()={ ? ? ? ? ? ? ? //重點:主構造方法傳入的類型必須要有-----> ?Person ? ? ? ? ?
? ? ?println("喜歡學習scala")
? ?}
?}
? def main(args: Array[String]): Unit = {
? ? val person: Person = new Person?
? ? person.work()
? ? person.study()??
? }
}
1
注:
創建隱式類,主構造函數中必須要引入一個目標類當參數,且隱式類必須要在 object 中創建
本文是將隱式類與目標類寫在了一個scala文件中,當隱式類寫在其他文件中,調用時引入該隱式類所在的包即可
方法②: 使用 隱式函數 轉換,創建Person對象時,編譯器默認會將Person對象轉為Student對象,從而使得新建的Person對象有了雙重身份,可以隨便調用這兩個類中的方法
代碼如下:
創建一個scala class文件: Person
class Person() {? ?
? def work()={
? ? println("人每天都要工作")
? }
}
class Student(){??
? def study()={ ? ? ? ? ? ? ??
? ? println("喜歡學習scala")
? }
}
object Test1{
? //重點:定義一個隱式函數,將 Person 轉為 Student
? implicit def personToStudent(obj:Person):Student = new Student
??
? def main(args: Array[String]): Unit = {
? ? val person: Person = new Person?
? ? person.work()
? ? person.study()??
? }
}
注:
使用隱式函數,Studnet類只需定義為一個普通類即可
Person類可以使用多個隱式函數轉型,從而使用其他類中的方法