给定具有特征Ordered
的对象,是否有任何方法可以获得与原始对象使用相同比较的Ordering
?
我想要这样做的原因是我已经使用以下签名实现了合并排序(Manifest
只是为了我可以实例化新的List[T]
和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
订单。在我看来,实现这一点的简单方法就是以某种方式从Ordering[T]
获得T
。 ScalaDoc似乎表示这可能是通过暗示来实现的:
Ordered和Ordering都提供了允许它们互换使用的含义。
但是,我不知道要导入哪些内容才能执行此操作。
答案 0 :(得分:1)
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] = {
...
}
有关详细信息,您可能会对此通用合并排序blog post感兴趣。
答案 1 :(得分:1)
如果你定义:
def mergeSorted[T : Ordering : Manifest](li: List[T]) : List[T]
编译器会把它变成
def mergeSorted[T : Manifest](li: List[T])(implicit ev: Ordering[T]) : List[T]
一切都会按照您的意愿运作。