scala的隐式可以让操作变得更加简洁,文末的参考中列出的implicit
的相关博文很好的表达了隐式的作用及使用方式,这里主要分析几个案例。
1 浅看Map
final class MyTuple2[A](private val self: A) {
def & [B](y: B): (A, B) = Tuple2(self, y)
def map [B](y: B): (A, B) = Tuple2(self, y)
}
object myTrait {
implicit def any2MyTuple2[A](x: A): MyTuple2[A] = new MyTuple2(x)
}
object MapUseDriver extends App {
import myTrait._
val a = Map(1 & "A",2 & "B")
println(a)
val c = Map(1.&("A"),2.&("B"))
println(c)
val b = Map(1 map "A", 2 map "C")
println(b)
val myMap = new MyTuple2[Int](1)
println(myMap.map(2))
}
文中 1 & A
为什么是有效的?
因为隐式方法 any2MyTuple2
的作用,使得在该作用域下的任意类型对象都有转化为MyTuple2
类型的能力,也即都可以拥有MyTuple2
的方法。
更多的可以查找Predef.scala
中的ArrowAssoc
类以及隐式方法any2ArrowAssoc
。