【发布时间】:2021-01-03 08:52:36
【问题描述】:
我正在玩一些隐式解析,并想了解这个隐式 val 有什么用?在订购我们有
trait OptionOrdering[T] extends Ordering[Option[T]] {
def optionOrdering: Ordering[T]
def compare(x: Option[T], y: Option[T]) = (x, y) match {
case (None, None) => 0
case (None, _) => -1
case (_, None) => 1
case (Some(x), Some(y)) => optionOrdering.compare(x, y)
}
}
implicit def Option[T](implicit ord: Ordering[T]): Ordering[Option[T]] =
new OptionOrdering[T] { val optionOrdering = ord }
我想知道什么时候隐式 def Option[T](implicit ord: Ordering[T]): Ordering[Option[T]] 有用或被调用。
我尝试了以下方法:
def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
val e = implicitly(Ordering[Option[T]]).compare(value1, value2)
}
但是编译器不喜欢它。
未找到:类型 T def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
如果我这样做可能没有意义,但只是为了方便
def test[Option[Int]: Ordering](value1: Option[Int], value2: Option[Int]) = {
val e = implicitly(Ordering[Option[Int]]).compare(value1, value2)
}
I get
type Option takes type parameters
def test[Option[Int]: Ordering](value1: Option[Int], value2: Option[Int]) = {
No implicit Ordering defined for Option[Int]
有人可以举一个例子说明如何使用隐式,或者它在哪里有用和实际使用?
我的假设是,当需要 Ordering[Option[T]] 时,调用此函数来解决隐式问题。但我无法做到这一点....
编辑 好吧,我写了以下更有意义的内容
def test(value1: Option[Int], value2: Option[Int]) = {
val e = implicitly(Ordering[Option[Int]]).compare(value1, value2)
}
然后我不明白的是上下文绑定问题
def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
val e = implicitly(Ordering[Option[T]]).compare(value1, value2)
}
What's wrong with writing a context bound like that ?
【问题讨论】:
-
请注意,拥有该特征很奇怪,通常,您只需在
implicit def的主体中实现一个匿名类