我在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
类型类声明,一切正常。
答案 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)使用给定返回类型的def
或val
:
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]
}
我认为这是一个编译器错误,但至少你可以解决它。