从伴侣对象中找不到隐含值

时间:2014-01-15 11:59:39

标签: scala

我在foo对象中声明了一个函数Bar

package test
object Bar{
 def foo[T : A](b: T) = println(b)
 def main(args: Array[String]) {
    foo(3)
 }
}

其中A在同一个包中声明:

sealed trait A[T]
object A {
  implicit object AInt extends A[Int]
  implicit object AString extends A[String]
}

在此配置中,Bar对象无法编译并生成此错误消息:

could not find implicit value for evidence parameter of type test.A[Int]
    foo(3)
       ^

但是当我将trait A及其伴随对象放入包对象test时,一切正常。为什么呢?

修改

问题在于声明的顺序。如果我在A声明之前放置Bar类型类声明,一切正常。

1 个答案:

答案 0 :(得分:3)

所以这两个解决方案似乎是:

(1)首先声明A

sealed trait A[T]
object A {
  implicit object AInt    extends A[Int   ]
  implicit object AString extends A[String]
}

object Bar {
  def foo[T: A](b: T) = println(b)
  def main(args: Array[String]): Unit = foo(3)
}

(2)使用给定返回类型的defval

object Bar {
  def foo[T: A](b: T) = println(b)
  def main(args: Array[String]): Unit = foo(3)
}

sealed trait A[T]
object A {
  implicit def aInt   : A[Int   ] = AInt
  implicit def aString: A[String] = AString

  private object AInt    extends A[Int   ]
  private object AString extends A[String]
}

我认为这是一个编译器错误,但至少你可以解决它。