理解Scala中的对象导入
根据线程中已接受的答案 如果隐式对象封装在泛型类型的伴随对象中,则无需显式地从对象导入属性和行为 使用这种逻辑,我无法理解为什么在删除import num之后,下面的代码没有得到编译理解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._
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
实例
为了加深理解,考虑咨询或(特别是访问上下文绑定的部分引入的隐式参数)