在每日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
声明。这意味着我的同伴应该在他们的课程之前去,但我宁愿留下他们在示例中。
为什么这个订单很重要?有解决方法吗?
答案 0 :(得分:1)
保持您希望的订单的可能解决方法:
object A {
implicit val aFoo: FooTypeClass[A] = new FooTypeClass[A] {
def foo: A = new A {
override def toString = "a"
}
}
}
我一直在寻找解释为什么object
(而不是val
)不合适。