Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在这个示例中,Scala是如何深入理解隐式工作的_Scala_Implicit Conversion_Traits - Fatal编程技术网

在这个示例中,Scala是如何深入理解隐式工作的

在这个示例中,Scala是如何深入理解隐式工作的,scala,implicit-conversion,traits,Scala,Implicit Conversion,Traits,在书中对Scala进行了深入研究。下面是隐式作用域的示例: scala> object Foo { | trait Bar | implicit def newBar = new Bar { | override def toString = "Implicit Bar" | } | } defined module Foo scala> implicitly[Foo.Bar] res0: Foo.Bar = Implicit

在书中对Scala进行了深入研究。下面是隐式作用域的示例:

scala> object Foo {
     | trait Bar
     | implicit def newBar = new Bar {
     |   override def toString = "Implicit Bar"
     | }
     | }
defined module Foo

scala> implicitly[Foo.Bar]
res0: Foo.Bar = Implicit Bar

我这里的问题是,在上面给出的示例中,您是如何隐式地发现trait栏的实现的?显然,对于Foo.Bar,它的工作原理类似于Foo#Bar,也就是说,
如果T是一个类型投影S#U,那么S的各个部分以及T本身
都在隐式范围内(规范的7.2部分,但请参阅隐式范围的常用参考资料,如您已经在查阅的)。(最新消息:它并没有确切地说明这种情况,也没有说明一个真实的例子是否看起来像是人造的。)

看看这是否解决了你的问题?
object Foo {
  trait Bar
  implicit def newBar = new Bar {
    override def toString = "Implicit Bar"
  }
}

class Foo2 {
  trait Bar
  def newBar = new Bar {
    override def toString = "Implicit Bar"
  }
}
object Foo2 {
  val f = new Foo2
  implicit val g = f.newBar
}

object Test extends App {
  // expressing it this way makes it clearer
  type B = Foo.type#Bar
  //type B = Foo.Bar
  type B = Foo2#Bar
  def m(implicit b: B) = 1
  println(implicitly[B])
  println(m)
}