根据线程Using implicit objects within classes
中接受的答案如果隐式对象封装在通用类型的伴随对象中,则无需从对象中显式导入属性和行为。
使用这种逻辑,我无法理解为什么删除导入编号后无法编译下面的代码_
@ViewChild(FormGroupDirective) formDirective: FormGroupDirective;
submitBtnClick() {
this.formDirective.resetForm();
}
有人可以对此概念有所启发吗?
答案 0 :(得分:1)
因为从gt
导入的toDouble
和num
的使用不在隐式位置-即toDouble
被显式使用,sortWith
自变量没有标记为隐式-因此隐式解析不适用于他们。
因此,import num._
基本上放入稍后使用的 explicit 范围方法,特别是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)
}
请注意,没有numeric
实例从隐式作用域makeDouble
变出,并且sortWithImplicit
使用隐式解析。
为更深入地了解,请考虑咨询scala docs on implicits或this answer(特别是“访问由上下文绑定引入的隐式参数”一节)