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

如何访问类(在Scala中)定义的隐式转换?,scala,implicit-conversion,Scala,Implicit Conversion,我有一个这样的抽象类: 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 cl

我有一个这样的抽象类:

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()
  ...
}
我可以在其他地方使用这些对象成员,比如
函数thatExpectsanInteger(MyObject.intVal)
,这让我很高兴:)

不过,为了提高可测试性,我想将这个
对象
放入一个
中,并在使用该类的任何地方插入该类的实例。然而,通过将
MyObject
转换为一个类,我似乎无法再使用这种隐式转换,不管我做了什么,这让我很难过:(


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

您的隐式有点奇怪,但我假设这只是一个示例,所以我不打算深入讨论详细情况

我认为这不起作用的原因是,如果在伴生对象的范围内,编译器会查找隐式。如果将其转换为类,则必须首先导入它。一种方法是:

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

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

您的隐式有点奇怪,但我认为这只是一个示例,所以我不打算详细介绍

我认为这不起作用的原因是,如果在伴生对象的范围内,编译器会查找隐式。如果将其转换为类,则必须首先导入它。一种方法是:

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

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

是的,这完全是我所缺少的,我没有意识到你可以将对象中的成员导入到当前范围。但是我对你关于“做得更好”或“奇怪”的想法也很感兴趣我的实际代码在结构上与此相同(我特别尝试实现一组类来从不同的配置文件加载值)所以我很感谢您的输入。很难向您指出任何特定的模式等。但是,为了将它们添加到可变集合中,然后使用隐式转换来展开它们,而使用这些包装并不是很习惯的做法。缓冲区是公共的,这也增加了奇怪之处。但是,如果您正在创建某种解析器,那么可能是这样的这不是什么大问题。是的,这完全是我所缺少的,我不知道你可以将对象中的成员导入当前范围。但是我也对你关于“做得更好”或我使用隐式的“奇怪”的想法非常感兴趣。我的实际代码在结构上与此相同(我特别尝试实现一组类来加载来自不同配置文件的值)所以我很感谢您的输入。很难向您指出任何特定的模式等。但是,为了将它们添加到可变集合中,然后使用隐式转换来展开它们,而使用这些包装并不是很习惯的做法。缓冲区是公共的,这也增加了奇怪之处。但是,如果您正在创建某种解析器,那么可能是这样的这不是什么大问题。