Если вы посмотрите на сигнатуру типа toIndexedSeq
на List
, вы увидите, что она принимает параметр типа B
, который может быть любым супертипом A
:
def toIndexedSeq [B >: A] : IndexedSeq[B]
Если вы пропустите этот параметр типа, то компилятор по сути должен угадать, что вы имели в виду, выбирая наиболее конкретный тип из возможных.Вы могли бы иметь в виду List(3,2,1).toIndexedSeq[Any]
, который, конечно, не может быть отсортирован, так как нет Ordering[Any]
.Кажется, что компилятор не будет играть «угадать параметр типа», пока все выражение не будет проверено на правильность ввода (возможно, кто-то, кто знает что-то о внутренностях компилятора, может расширить это).
Чтобы заставить его работать, выможет либо а) предоставить требуемый параметр типа самостоятельно, т.е.
List(3,2,1).toIndexedSeq[Int].sortBy(x=>x)
, либо б) разделить выражение на два, так что параметр типа должен быть выведен перед вызовом sortBy
:
val lst = List(3,2,1).toIndexedSeq; lst.sortBy(x=>x)
Редактировать:
Это, вероятно, потому что sortBy
принимает аргумент Function1
.Подпись sortBy
-
def sortBy [B] (f: (A) => B)(implicit ord: Ordering[B]): IndexedSeq[A]
, тогда как sorted
(который вы должны использовать вместо этого!) Отлично работает с List(3,2,1).toIndexedSeq.sorted
def sorted [B >: A] (implicit ord: Ordering[B]): IndexedSeq[A]
Я не совсем уверен, почемуFunction1
вызывает эту проблему, и я иду спать, поэтому не могу думать об этом дальше ...