Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在导入“我的对象”时,使来自不同对象的隐式对象可访问_Scala_Import_Implicit - Fatal编程技术网

Scala 在导入“我的对象”时,使来自不同对象的隐式对象可访问

Scala 在导入“我的对象”时,使来自不同对象的隐式对象可访问,scala,import,implicit,Scala,Import,Implicit,当有人导入我的对象时,我希望其他对象(或包)中的一些隐式类对他们可用。在对象中具有import没有帮助,因为导入不是传递性导入的,因此我假设我必须使用一些隐式def或val,但是我找不到合理的方法来实现这一点,只有非常详细的def: object Main extends App { object A { implicit class ExtendedMath(val x: Double) extends AnyVal { def square = x * x

当有人导入我的对象时,我希望其他对象(或包)中的一些隐式类对他们可用。在对象中具有
import
没有帮助,因为导入不是传递性导入的,因此我假设我必须使用一些
隐式
def
val
,但是我找不到合理的方法来实现这一点,只有非常详细的
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所建议的,典型的方法是定义一个特征中的隐含成分,然后你可以将其多次混合。唯一需要注意的是,trait中不允许使用值类,因此您必须采用分离值类和隐式转换的方法:

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
}

您可以控制要从中获取隐式的包吗?@m-z在这种情况下,我可以控制,但我可以想象有时有人希望从第三方包中转发隐式。将隐式转换为由两个对象扩展的特征“因此您必须采用分离值类和隐式转换的方法:”-鉴于此负担不在对象的用户身上,我认为这是可以接受的。如果这是一种“典型的方法”,它有什么名字吗?@Suma我不知道这种方法有什么特别的名字。但是我已经看过很多次了,所以它很常见。