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



我有一个这样的抽象类:

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中,并在使用该类的任何地方注入该类的实例。但是,通过将MyObject变成一个类,无论我尝试了什么,我似乎都无法再使用这种隐式转换,这让我:(难过。

当然,这种转换只能省去我调用get方法,我可以没有它,但我仍在学习 scala 隐式,我想了解为什么这不起作用以及是否有办法做到这一点。

你的隐含感觉有点奇怪,但我认为这只是一个例子,所以我不打算详细介绍。

我看到为什么这不起作用的原因是,如果在配套对象的范围内,编译器会查找隐式。如果你把它变成一个类,你必须先导入它。一种方法如下:

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

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

最新更新