Scala暗示解析机制是否依赖于声明顺序?

时间:2013-12-04 16:32:46

标签: scala implicit

在每日Scala编码期间,我遇到了一个问题,Scala暗示解决方案取决于声明顺序。一个简单的例子:

object example extends App {
  trait FooTypeClass[T] {
    def foo: T
  }

  def bar[T](implicit tc: FooTypeClass[T]) = println(tc.foo)

  class A {
    // bar[A] doesn't compile
  }
  object A {
    implicit object aFoo extends FooTypeClass[A] {
      def foo: A = new A { override def toString = "a" }
    }
  }

  bar[A]
}

它确实编译,但如果我取消注释注释行,它将无法在范围内找到所需的隐式。因此,为了使其编译,我应该在object A之前放置class A声明。这意味着我的同伴应该在他们的课程之前去,但我宁愿留下他们在示例中。

为什么这个订单很重要?有解决方法吗?

1 个答案:

答案 0 :(得分:1)

保持您希望的订单的可能解决方法:

object A {
    implicit val aFoo: FooTypeClass[A] = new FooTypeClass[A] {
      def foo: A = new A {
        override def toString = "a"
      }
    }
  }

我一直在寻找解释为什么object(而不是val)不合适。