scala - 从辅助对象中找不到隐式值

  显示原文与译文双语对照的内容

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


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]
}

在这里配置栏对象中,不会编译并生成这里错误信息:


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

但是当我将 trait A 及其伴生对象放入包对象 test 中时,所有工作都很好。 为什么?

编辑

问题是按照声明。 如果在 Bar 声明之前放置 A typeclass声明,一切都正常。

时间: 作者:

因此,这两个解决方案似乎是:

( 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]
}

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

作者:
...