Scala並無定義本身的String類型,而是直接借用了Java中的String,因此若是你定義一個String類型的值: html
val str = "hello"返回的值的類型直接就是java.lang.String。然而,咱們知道在Scala中能夠像使用List同樣來操做String值,例如:
str.reverse //String = olleh str.map(_.toUpper) //String = HELLO str drop 3 //String = lo str slice (1, 4) //String = ell val s: Seq[Char] = str
可是,map, drop,slice等操做並無在java.lang.String中定義,爲何能夠直接在這裏使用? java
熟悉C#的同窗應該都知道C#提供了extends method來擴展已有的類庫,來給外部類型定義新的方法。Scala不支持extends method,可是提供了implicit conversion(隱式轉換),它能夠實現一樣的效果並且更加靈活。感興趣的同窗能夠看看這個視頻。 編程
究竟什麼是implicit conversions?其實就是進行從一個類型到另外一個類型的隱式轉換。例以下面這個例子把一個Float值賦給一個Int變量,默認是出錯的: app
scala> val i: Int = 3.5 <console>:4: error: type mismatch; found : Double(3.5) required: Int val i: Int = 3.5可是若是定義一個implicit轉換函數,就能夠作到隱式轉換。
implicit def doubleToInt(x: Double) = x.toInt scala> val i: Int = 3.5 i: Int = 3
上面說的是implicit函數,在Scala 2.10中又新增了implicit class這個功能,能夠更加方便地進行類型轉換。具體能夠看這個文檔。 函數
回到String類型,實際上Scala在java.lang.String上定義了兩個不一樣優先級的implicit conversion,按須要編譯器會自動選擇使用: ui
val s: Seq[Char] = str
這種基於隱式轉換的類型擴展,值得在實際Scala編程中實踐。 scala