我的代码:
import Ordered.orderingToOrdered
import java.util.Date
val (d1, d2) = (Option(new Date()), Option(new Date()))
d1 compare d2
-Xlog-implicits 的结果:
Information:(268, 5) math.this.Ordering.Option is not a valid implicit value for
scala.math.Ordering[Option[java.util.Date]] because:
diverging implicit expansion for type scala.math.Ordering[Option[java.util.Date]]
starting with method ordered in trait LowPriorityOrderingImplicits
d1 compare d2
^
Information:(268, 5) math.this.Ordering.comparatorToOrdering is not a valid implicit
value for scala.math.Ordering[Option[java.util.Date]] because:
diverging implicit expansion for type scala.math.Ordering[Option[java.util.Date]]
starting with method ordered in trait LowPriorityOrderingImplicits
d1 compare d2
^
Error:(268, 5) diverging implicit expansion for type
scala.math.Ordering[Option[java.util.Date]]
starting with method ordered in trait LowPriorityOrderingImplicits
d1 compare d2
^
我认为这里发生的是 Ordered 和 Ordering 之间的循环 - 隐式 Ordering[Option[Date]] 在范围内,因为它是在对象 Ordering 中定义的,它是 java.util.Comparator 的子类,因此您可以使用它来创建另一个订单...
这是针对scala 2.10编译的,好像2.11在这方面有变化,但是当我尝试升级scala时,scalac进入了无限循环。
编辑:只是为了表明我不是一无所知,我暂时用import Ordered._
我的替换来修复它import OrderedFix._
:
/** Avoid implicit cycles between scala Ordered and Ordering */
trait OrderedFix[T] {
def compare(that :T) :Int
def < (that :T) = compare(that) <0
def <=(that :T) = compare(that) <=0
def > (that :T) = compare(that) >0
def >=(that :T) = compare(that) >=0
}
object OrderedFix {
implicit def ordered[T :Ordering](self :T) :OrderedFix[T] = new OrderedFix[T] {
def compare(that :T) = implicitly[Ordering[T]].compare(self, that)
}
}
但这很愚蠢,这就是标准库应该提供的......