如何访问定义为 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
我相信这可以做得更好,但只能通过整体更改代码的结构。
我有一个摘要 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
我相信这可以做得更好,但只能通过整体更改代码的结构。