给定一个具有特征Ordered的对象,是否有任何方法可以获得使用与原始对象相同比较的Ordering?
我之所以要这样做,是因为我实现了具有以下签名的合并排序( Manifests只是为了能够实例化新的List[T]s和Array[T]s:
def mergeSorted[T : Manifest](li: List[T], ord: Ordering[T]) : List[T]我想要做的是用一个带有此签名的方法重载它:
def mergeSorted[T <: Ordered[T] : Manifest](li: List[T]) : List[T]这样,如果我对Int进行排序,我就不必手动地按Int排序了。在我看来,实现这一点的最简单的方法就是从T那里得到一个Ordering[T]。ScalaDoc似乎说,这是可能的,通过暗示:
有序和有序都提供暗示,使它们可以互换使用。
但是,我不知道为了做到这一点,需要导入哪些内容。
发布于 2017-04-16 17:18:39
如果你定义:
def mergeSorted[T : Ordering : Manifest](li: List[T]) : List[T]编译器会将其转换为
def mergeSorted[T : Manifest](li: List[T])(implicit ev: Ordering[T]) : List[T]一切都会按照你的意愿运作。
发布于 2017-04-16 16:59:04
math.Ordering和math.Ordered都可以通过implicit parameter和implicit conversion分别实现所需的功能。根据要使用哪一种签名,mergeSort函数将具有类似于以下内容之一的签名:
// Using math.Ordering
def mergeSort[T](li: List[T])(implicit order: Ordering[T]): List[T] = {
...
}
// Using math.Ordered
def mergeSort[T <% Ordered[T]](li: List[T]): List[T] = {
...
}有关详细信息,您可能对此通用合并排序博客帖子感兴趣。
https://stackoverflow.com/questions/43439405
复制相似问题