1.隐式转换作用域
关于隐式转换查找的顺序问题:
1. 简单查找
class Implicits {
implicit val content = "Java Hadoop"
}
object Implicits {
implicit val content = "Scala Spark"
}
object ImplicitsAdvanced {
def main(args: Array[String]): Unit = {
def printContent(implicit content: String) = println(content)
implicit val content = "I love spark"
import Implicits._
printContent
}
printContent 的隐式参数是String类型,所以会找String类型的隐式参数,
上面例子上有三个可能,"Java Hadoop", "Scala Spark", "I love spark"
结果是
I love spark
即它会先在main这个大括号里找满足要求的String类型隐式参数,找到就用,优先级最高。
只有找不到了才会去导入的类里找,把implicit val content = "I love spark"注释掉后
结果是
Scala Spark
说明它要找的是伴生对象里的隐式参数,而非类里面的隐式参数!
如果再加上一个隐式参数如下
object ImplicitsMsg {
implicit val content = "Kafak Zookeeper"
}
导入时这样导入
import ImplicitsMsg.content
结果是
Kafak Zookeeper
说明都是导入的情况下,优先选择具体的,通配符导入的优化级较低。
2.复杂查找
查找时如果在main方法里找不到,在导入的类的伴生对象里也找不到怎么办呢?
class ImplicitsMsg{
val content = "ImplicitsMsg class"
}
object Impl