Scala基礎應用(9)- 隱式轉換

Scala基礎應用(9)- 隱式轉換

首先要明確隱式轉換隻針對類型,與名稱無關,我把隱式類型分爲以下三類

  • 隱式參數
  • 隱式方法
  • 隱式類

注意:隱式轉換隻發生在運行時當前上下文沒有對應的調用。

同時,隱式轉換有如下限制:

  • 不存在二義性, 即對同一類型不能有兩種隱式轉換
  • 不能嵌套使用,如:convert1(convert2(x))) + y
  • 如果有對應的非隱式存在,則隱式不會執行

下面爲大家一一講解

隱式參數

也可稱爲隱式值,即爲隱式參數賦值

implicit val myname = "Mark Zhou"
def whoami(implicit name: String) = "My name is " + name
whoami 

隱式方法

或者叫隱式類型,它可以將一種類型轉換成另外一種類型

class Person(name: String, age: Int) {
    def detail = s"My name is $name and my age is $age"
}
import scala.language.implicitConversions
import scala.language.postfixOps
implicit def mydetail(name: String) = new Person(name, 18)

"Mark Zhou".detail

這裏我們思考一下,"Mark Zhou".length會出現什麼情況?查看開始部分的“注意”項。

隱式類

Scala 2.10後纔開始提供隱式類,同時隱式類有一些限制:

  • 隱式類必須被定義在特質,類和伴生對象裏
  • 有且僅有一個構造參數
  • 作用域內不能有同名方法,變量或者伴生對象
  • 不能是case class (case class 會自動產生伴生類,違反第3條)
object ImplicitClassDemo {
    implicit class MyClass(private val name: String) {
        def detail = s"My name is $name and my age is 18"
    }
}

import ImplicitClassDemo._
"Mark Zhou".detail

隱式查找規則

  • 首先在當前作用域內查找隱式
  • 其次會在參數的作用域內查找隱式, 即在與該參數類型相關聯的全部伴生模塊裏查找,如類型T
    • 如果T被定義爲T with TypeA with TypeB with TypeC, 那麼TypeA, TypeB 以及TypeC都是T的關聯部分,這些類型的伴生對象都是查找對象
    • 如果T被定義爲參數化類型,則會查找該類型相關聯的部分,如List[Int] 會查找List和Int的伴生對象
    • 如果T被定義在某個伴生對象內,則該伴生對象和T都會被查找
    • 如果T類型注入S#T, 則S和T都會被查找
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章