如何访问定义为 class 的隐式转换(在 Scala 中)?

How to access an implicit conversion defined a class (in Scala)?

我有一个摘要 class 像这样:

abstract class Base {
  val myInners = mutable.ArrayBuffer[Inner[Any]]()
  abstract class Inner[+T] {
    myInners += this
    def get: T
    // other functionality here
  }
  implicit def innerToValue[T](inner: Inner[T]) = inner.get
  class IntInner extends Inner[Int] { ... }
  class StringInner extends Inner[String] { ... }
  ...
}

最初我有一个像

这样的单例对象
object MyObject extends Base {
  val intVal = new IntInner()
  val stringVal = new StringInner()
  ...
}

而且我能够在其他地方使用这些对象成员,例如 functionThatExpectsAnInteger(MyObject.intVal),这让我很高兴 :)。

不过,为了提高可测试性,我想将此 object 变成 class 并在任何使用它的地方注入 class 的实例。但是,通过将 MyObject 变成 class,无论我尝试了什么,我似乎都无法再使用这种隐式转换,这让我很难过:(.

当然,这种转换只节省了我调用 get 方法的时间,没有它我也可以生活,但我仍在学习 scala implicits,我想了解为什么这不会工作,如果 有办法做到这一点。

你的隐式有点奇怪,但我认为这只是一个例子,所以我不打算深入细节。

我认为这不起作用的原因是,如果在伴随对象的范围内,编译器会查找隐式。如果你把它变成 class 你必须先导入它。一种方法如下:

val obj = new MyObject()
import obj.innerToValue
val x : Int = obj.intVal

我相信这可以做得更好,但只能通过整体更改代码的结构。