SeqLike中已排序方法的签名

时间:2016-08-21 16:41:32

标签: scala scala-collections

我不明白在sorted特征中签署SeqLike方法的目的:

def sorted[B >: A](implicit ord: Ordering[B]): Repr

更确切地说,我没有得到:

  1. B>:A
  2. 的原因
  3. Repr是什么意思?
  4. 也许你可以对此有所了解。

    提前感谢您的回答!

3 个答案:

答案 0 :(得分:2)

<canvas id="myCanvas2" width="100" height="103" style="border:1px solid black;display: -webkit-inline-box;border: 1px solid black;margin-right: 0px;"> 表示可以使用B上的任何排序调用[B >: A],其中B是A的超类型。

我认为A是特质本身的类型参数,即

SeqLike定义为sorted。详尽无遗,如SeqLike[A, This]SeqLike[A, +This <: SeqLike[A, This] with Seq[A]]是F-有界多态性。

This <: SeqLike[A, This]

actual return type of SeqLike.sortedtrait A[T <: A[T]] {} // the type parameter to A must be an A class C extends A[C] {} // this is how you use it.

这很有用,因为它允许SeqLike的方法不仅返回This s,还返回子类型!

回到之前的简单例子......

SeqLike

答案 1 :(得分:2)

  1. 该方法采用隐式Ordering,它应该能够处理A的某些超类型(因此B >: A)。即您应该可以使用Ordering[AnyVal]来比较Int值(因为AnyValInt的超类型。)
  2. ReprSeqLike特征本身(SeqLike[+A, +Repr])的类型参数,描述为“包含元素的实际集合的类型”。这是为了确保像sorted这样的方法会返回相同类型的集合(例如List.sorted仍然是List)。

答案 2 :(得分:0)

以下是B >: A

的简单解释

让我们考虑这个类(不编译):

class C[+T] {
  def m(x: T): T = x
}

+T表示协变,即C[Any]是例如C[Int]的超类。 "123"。现在(StringAny,所以它也是val cInt: C[Any] = new C[Int] cInt.m("123") // ??? We are supposed to return Int here ):

class C[+T] {
  def m[A >: T](x: A): A = x
}

实际上:

A

所以(编译器推断AnyStringAny最近的共同祖先,这是val cInt: C[Any] = new C[Int] cInt.m("123") // Any = 123

SeqLike

trait SeqLike[+A, +Repr]的定义:+A,注意{{1}}