Scala 类型参数T以排序为界[T]
在实现可排序的数据结构时,我考虑这样做:Scala 类型参数T以排序为界[T],scala,implicit,Scala,Implicit,在实现可排序的数据结构时,我考虑这样做: trait MaxHeap[T <: Ordering[T]] { def insert(e: T): Unit ... } 我的问题是,如果我的类/特征中有许多方法涉及比较,是否有一种方法可以指定类/特征的元素类型为可比较的,这样我就不需要为这些方法声明隐式?您可以声明一个定义顺序的隐式参数,然后可以在所有方法中使用它: class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ..
trait MaxHeap[T <: Ordering[T]] {
def insert(e: T): Unit
...
}
我的问题是,如果我的类/特征中有许多方法涉及比较,是否有一种方法可以指定类/特征的元素类型为可比较的,这样我就不需要为这些方法声明隐式?您可以声明一个定义顺序的隐式参数,然后可以在所有方法中使用它:
class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ...
如果它是一个特征,则不能接受参数,但可以将其声明为隐式值:
trait Heap[T] {
implicit protected val cmp: Ordering[_ >: T];
// ... use cmp in your methods ...
}
然后使用它的每个类都可以接受一个隐式参数来覆盖它:
class MaxHeap[T](implicit override protected val cmp: Ordering[_ >: T])
extends Heap[T]
{
// ...
}
更新:对于某些
订购
不是反向的。这就是为什么我使用排序[\u>:T]
,因为它允许更大的灵活性。您可以使用为超类T
定义的排序。当然,您可以只使用cmp:Ordering[T]
,但不能执行以下操作
new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] {
// ...
});
另外,
排序的整个思想是,您不必对t
施加任何约束。这更灵活,除其他外,允许对同一类进行不同的比较。Thank you@Petr。但这种方式并没有强制使T
具有可比性,就好像它在类型参数列表中是有界的一样。任何T
都可以,只要给出一个隐式的。但是我想知道为什么不使用排序[T]
。方便的操作符,如
由订购间接提供。隐式似乎不适用于订购[\u>:t]
。谢谢。它带来了极大的灵活性!
new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] {
// ...
});