理解Scala中的对象导入

理解Scala中的对象导入,scala,Scala,根据线程中已接受的答案 如果隐式对象封装在泛型类型的伴随对象中,则无需显式地从对象导入属性和行为 使用这种逻辑,我无法理解为什么在删除import num之后,下面的代码没有得到编译 implicit class GenericMedian[T: Numeric](seq: Seq[T]) { def median(): Double = { val num: Numeric[T] = implicitly[Numeric[T]] import num._

根据线程中已接受的答案

如果隐式对象封装在泛型类型的伴随对象中,则无需显式地从对象导入属性和行为

使用这种逻辑,我无法理解为什么在删除import num之后,下面的代码没有得到编译

implicit class GenericMedian[T: Numeric](seq: Seq[T]) {
    def median(): Double = {
      val num: Numeric[T] = implicitly[Numeric[T]]

      import num._
      val medianPosition = seq.length / 2
      seq.sortWith(gt) match {
        case x if x.length % 2 != 0 => x(medianPosition).toDouble()
        case x => (x(medianPosition).toDouble() + x(medianPosition - 1).toDouble()) / 2
      }

    }
  }

有人能解释一下这个概念吗?

因为从
num
导入的
gt
toDouble
的用法不在隐式位置,即显式使用
toDouble
,并且
sortWith
参数未标记为隐式,所以隐式解析对于他们

因此,
import num.
基本上将后面使用的显式作用域方法放入其中,特别是
num.gt
和另一个隐式
Numeric[T].Ops
,它具有
toDouble
实现

考虑以下示例-
median
被重写,以使用隐式解析的函数调用替换这两个显式用法:

implicit class GenericMedian[T: Numeric](seq: Seq[T]) {
  def median(): Double = {
    val medianPosition = seq.length / 2
    sortWithImpl(seq) match {
      case x if x.length % 2 != 0 => makeDouble(x(medianPosition))
      case x => (
        makeDouble(x(medianPosition)) +
        makeDouble(x(medianPosition - 1))
      ) / 2
    }

  }
  private def makeDouble(t: T)(implicit numeric: Numeric[T]): Double = numeric.toDouble(t)

  private def sortWithImplicit(seq: Seq[T])(implicit numeric: Numeric[T]): Seq[T] = seq.sortWith(numeric.gt)
}
请注意,没有从隐式作用域
makeDouble
sortWithImplicit
使用隐式解析调用任何
numeric
实例

为了加深理解,考虑咨询或(特别是访问上下文绑定的部分引入的隐式参数)