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都會被查找