当我的对象被导入时,使来自不同对象的隐式可访问

Make an implicit from a different object accessible when my object is imported

当有人导入我的对象时,我希望其他对象(或包)中的一些隐式 类 可供他们使用。在对象中包含 import 没有帮助,因为导入不是传递导入的,因此我假设我必须使用一些 implicit defval,但是我无法找到一些合理的方法如何实现这一点,只有一个相当冗长 def:

object Main extends App {

  object A {

    implicit class ExtendedMath(val x: Double) extends AnyVal {
      def square = x * x
    }

  }

  object X {

    import A._

    // what to write here, so that ExtendedMath is forwarded to our users?
    // following works, but it seems quite verbose
    implicit def extendedMath(x: Double): ExtendedMath = ExtendedMath(x)
  }


  import X._
  val a = 0.0
  println(a.square)
}

有没有更简洁的方法?

正如@stew 所建议的,典型的方法是在特征中定义隐式,然后您可以将其混合多次。唯一需要注意的是特征中不允许使用值 classes,因此您必须求助于分离值 class 和隐式转换:

class ExtendedMath(val x: Double) extends AnyVal {
  def square = x * x
}

trait HasMath {
  // note: method name somehow must not shadow
  // value class name, therefore we use lower-case
  implicit def extendedMath(x: Double): ExtendedMath = new ExtendedMath(x)
}

object A extends HasMath

object X extends HasMath

object Test {
  import X._
  4.0.square
}