我有一个这样的抽象类:
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
我相信这可以做得更好,但只能通过更改整体代码的结构。