Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 类型参数T以排序为界[T]_Scala_Implicit - Fatal编程技术网

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] {
    // ...
  });