【问题标题】:How comes my implicit gets shadowed by a method parameter?我的隐式如何被方法参数遮蔽?
【发布时间】:2014-04-04 23:12:31
【问题描述】:

给定以下代码:

case class W(s:String)
object W{
  implicit lazy val w=W("w")
}
trait A{
  implicit def a:W=W("a")
}
object B{
  def implicitUser(implicit w:W)=println(w.toString)
}
object Auser extends A{
  def testa(a:String="0")=B.implicitUser
  def testb(b:String="0")=B.implicitUser
}

你如何解释repl的以下输出

scala>Auser.testa()
W(w)

scala>Auser.testb()
W(a)

看起来testa中的方法参数名称阻止了隐式命名a的解析。 (scala 2.10.3)

【问题讨论】:

  • 听起来不错——implicit def a 被参数所掩盖,因此无法找到隐式解析。
  • 令人惊讶,因为类型不匹配......

标签: scala implicit-conversion scala-2.10


【解决方案1】:

隐式除了是隐式之外,还只是标识符。

这意味着您可以使用另一个具有相同名称的标识符来隐藏它们。

def foo(i: String) {
  for (i <- 0 to 3) { println(i) }   // Outer i is hidden
}

def foo(implicit i: String) {
  for (i <- 0 to 3) { println(i) }   // Outer i is still hidden
}

def bar(implicit i: String) { println("Bar "+i) }

def foo(implicit i: String) { bar }  // Works

def foo(implicit i: String) {
  for (i <- 0 to 3) bar              // Doesn't
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多