2017-02-20 1 views
1
trait LowPriorityOrderingImplicits { 

/** This would conflict with all the nice implicit Orderings 
    * available, but thanks to the magic of prioritized implicits 
    * via subclassing we can make `Ordered[A] => Ordering[A]` only 
    * turn up if nothing else works. Since `Ordered[A]` extends 
    * `Comparable[A]` anyway, we can throw in some Java interop too. 
    */ 

implicit def ordered[A <% Comparable[A]]: Ordering[A] = new Ordering[A] { 
def compare(x: A, y: A): Int = x compareTo y 
} 

    implicit def comparatorToOrdering[A](implicit cmp: Comparator[A]): Ordering[A] = new Ordering[A] { 
    def compare(x: A, y: A) = cmp.compare(x, y) 
    } 

} 

там, две неявные функции (упорядоченные [A] и comparatorToOrdering [A]) все возвращают Заказ [A], он должен конфликтовать, но зачем дозировать его там?Есть ли конфликты с неявным значением в Ordering [A] в исходном коде scala?

+0

Посмотрите на их подписи: для начала требуется «Сравнительный [A]», а второй требует «Компаратор [A]». Это разные неявные поиски. – pedrofurla

+0

может быть связано: https://stackoverflow.com/questions/36388954/inferring-type-of-generic-implicit-parameter-from-return-type/40609565 –

ответ

2

Только если для некоторого типа A существует неявное converstion A => Comparable[A]и неявное Comparator[A]. Единственный способ для этих имплицитов привести к чему-то двусмысленному - это решить их собственные неявные параметры. В этом случае оно не будет:

class Foo 

implicit val fooComp = new java.util.Comparator[Foo] { def compare(a: Foo, b: Foo): Int = 0 } 

val fooComparable = new java.lang.Comparable[Foo] { def compareTo(foo: Foo): Int = 0 } 

implicit def foo2Comp(foo: Foo): Comparable[Foo] = fooComparable 

scala> implicitly[Ordering[Foo]] 
<console>:16: error: ambiguous implicit values: 
both method ordered in trait LowPriorityOrderingImplicits of type [A](implicit evidence$1: A => Comparable[A])scala.math.Ordering[A] 
and method comparatorToOrdering in trait LowPriorityOrderingImplicits of type [A](implicit cmp: java.util.Comparator[A])scala.math.Ordering[A] 
match expected type Ordering[Foo] 
     implicitly[Ordering[Foo]] 
       ^

Так что технически возможно получить неоднозначную ошибку implicits, но это должно быть чрезвычайно редко. Если что-то уже есть Comparable, ему не нужно иметь неявный Comparator.

+0

большое спасибо –