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