6

ソート可能なデータ構造を実装するとき、私は次のようなことを考えていました:

trait MaxHeap[T <: Ordering[T]] {
    def insert(e: T): Unit
    ...
}

しかし、それは MaxHeap[Int] のような型では機能しません。標準コレクション ライブラリでは、コレクションの要素型 T は制限されません。代わりに、メソッドが T を Ordering[T] に変換する必要がある場合に暗黙的な関数が提供されます。

trait Seq[+A] extends ... {
    // it's Ordering[B], not Ordering[A], but the idea is the same.
    def max[B >: A](implicit cmp: Ordering[B]): A
}

私の質問は、比較を伴うクラス/特性に多くのメソッドがある場合、それらのメソッドの暗黙を宣言する必要がないように、クラス/特性の要素型を比較可能に指定する方法はありますか?

4

1 に答える 1

7

順序付けを定義する暗黙のパラメーターを宣言すると、それをすべてのメソッドで使用できます。

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

更新:いくつかの技術的な理由により Ordering、反変ではありません。これが、Ordering[_ >: T]柔軟性を高めることができるため、 を使用した理由です。のスーパークラスに対して定義されている順序付けを使用できますT。もちろん、だけを使用することもできますが、次のcmp: Ordering[T]ようなことはできません

new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] {
    // ...
  });

また、 の全体的な考え方は、 にOrdering制約を課す必要がないということですT。これはより柔軟で、とりわけ、同じクラスに対して異なる比較を行うことができます。

于 2013-07-11T16:12:02.727 に答える