scala - 明确的隐含

标签 scala implicit

考虑以下代码:

class A { def print = println("A") }
class B extends A { override def print = println("B") }

def foo(implicit a: A) = a.print

def bar(implicit a: A) = {
  implicit val b = new B
  foo
}

bar(new A) // B

我想知道为什么在foo中调用bar不会引发ambiguous implicit values错误。当然
implicit val b: A = new B

将引发该错误。为什么foo选择隐式b而不选择隐式a?或更笼统:将遵循哪些规则?

编辑:
由于我与Ivan进行了评论对话,因此我想澄清一下:如果我以与隐式方法参数相同的方式命名本地隐式val,那么我就会知道问题的答案。
def bar(implicit a: A) = {
  implicit val a = new B
  foo
}

然后,只有本地val a在作用域内,该作用域将覆盖method参数,因为它们具有相同的名称。

最佳答案

注意:我可能在很大程度上简化了事情,但是在测试中似乎如下所示。

这是因为第二个在内部范围内,所以它具有优先权。这与发生的事情相同

object test {
 val a = 5
 def test(i: Int) = {
   val a  = 6
   i + a
 }
}

在这种情况下,您希望a在函数内部为6。以下是类似的。
object test {
  implicit val i = 5; 
  { 
    implicit val b = 6; 
    test
  } 
  def test(implicit ii:Int) = println(ii)
} 

从评论更新。
scala> def test(a: Int) = {val a = 5; a }
test: (a: Int)Int

scala> test(6)
res1: Int = 5

关于scala - 明确的隐含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13526345/

相关文章:

scala - 关于Scala的下限

scala - 前向引用扩展了值(value)问题的定义

java - 用 Scala 隐式包装的 Java 接口(interface)实现的工厂方法?

scala - Scala 中的隐性证据是什么?到底有什么好处呢?

java - 如何使用多个行键从 cassandra 中的计数器列获取值?

scala - 注释掉Scala中的部分代码

scala - 使用 parquet 文件元数据创建 Hive 表

string - 连接两个 RDD[String] -Spark Scala

scala - 解释 Scala 类型级编程中使用的 `LowPriorityImplicits` 模式

templates - 如何明确引用此模板成员?