Мне нужна помощь в понимании этой сигнатуры типа:
def func[A : Ordering : ClassTag](a: A) = ???
Я придумал фиктивные примеры, используя сигнатуру типа выше ... а также сигнатуру типа, с которой я более знаком, что яПоверьте, это почти то же самое, основанное на моем фиктивном примере, но я также могу придумать игрушечный пример, где они явно не совпадают.
Эти два кажутся похожими:
import scala.reflect.ClassTag
// type signature in question
def func1[A : Ordering : ClassTag](elems: A*) =
Array[A](elems: _*).sorted
// my typical type signature
def func2[A <% Ordered[A]](elems: A*)(implicit c: ClassTag[A]) =
Array[A](elems: _*).sorted
Пример использования:
class BB(val i: Int) extends Ordered[BB] {
def compare(that: BB): Int = that.i - i
override def toString = s"BB(${i})"
}
func1(new BB(33), new BB(100), new BB(-1))
func2(new BB(33), new BB(100), new BB(-1))
Вывод для каждого из них:
Array[BB] = Array(BB(100), BB(33), BB(-1))
Один крайний случай, который я могу придумать, где они различаются ... указывает на то, что один не просто синтаксический сахардля другого ... это следующее, где функция имеет неявный порядок для класса, который отличается от естественного порядка сортировки класса.
Этот пример (ниже) работает нормально, а implicit val ordering
переопределяет класс BBестественный порядок сортировки, как я (вроде) ожидал.
def func3[A <% Ordered[A] : ClassTag](elems: A*) = {
// opposite order defined in class BB
implicit val ordering: Ordering[A] =
Ordering.by{ case bb: BB => bb.i }
Array[A](elems: _*).sorted
}
Эта версия (ниже) дает мне ошибку ...
def func3[A : Ordering : ClassTag](elems: A*) = {
// opposite order defined in class BB
implicit val ordering: Ordering[A] =
Ordering.by{ case bb: BB => bb.i }
Array[A](elems: _*).sorted
}
ошибка: неоднозначные неявные значения:оба значения доказательства $ 1 типа Ordering [A] и valупорядочение типа Ordering [A] соответствует ожидаемому типу scala.math.Ordering [A]
Итак, основываясь на этом ... Я предполагаю, что : Ordering
преобразует Ordered[BB]
вimplicit val ordering
... или что-то в этом роде?Существуют ли более глубокие различия, которые не могут быть обнаружены в моих примерах игрушек?
Заранее спасибо.