为什么打印以下代码:
class TestClass{
case class printClass(s: Symbol) {
def pr() = println(s);
}
implicit def implPrint(i: Symbol) = printClass(i)
}
object TestObject extends TestClass{
def main(args:Array[String]) = {
'x pr
}
}
虽然以下代码没有:
class TestClass{
implicit def implPrint(i: Symbol) = println(i)
}
object TestObject extends TestClass{
def main(args:Array[String]) = {
'x
()
}
}
据我所知,如果编译器认为隐含函数是个好主意,则会自动调用隐式函数。为什么编译器在两种情况下都不会调用implPrint()
?我在这里俯瞰什么?
答案 0 :(得分:2)
隐式方法仅在需要时调用,否则会出现许多意外行为。在这里,您不会调用它不包含的方法,或者如果将其传递给需要其他类型变量的方法,则不会调用“implPrint”。
答案 1 :(得分:2)
编译器在无法理解手头代码的语法时会考虑Implicits。在您的第一个示例中,您尝试在Symbol对象上调用pr()
,这是编译器无法理解的语法,因此它转向含义。在你的第二个例子中,你声明了一个符号,并且没有对它做任何事情,语法与编译器的解析一致,所以它没有看到含义。