3

私はいくつかのパラメーター化されたクラス C[T] を作成しています。タイプ T の特性のいくつかの要件を作成して、クラスのパラメーターにできるようにしたいと考えています。T がトレイトまたはクラスから継承されたと言いたいだけなら (順序付けの場合と同様)、簡単です。しかし、いくつかの機能も実装したいと考えています。

たとえば、定義済みの型の多くが MinValue と MaxValue を実装しているのを見てきました。型 T にもこれらを実装したいと思います。暗黙の関数を定義するだけのアドバイスをいくつか受け取りました。しかし、すでに実装されている場合に、すべてのユーザーがこれらの機能を実装することを余儀なくされるのは好ましくありません。私も自分のコードにそれらを実装することができましたが、それは貧弱な迅速な修正のようです.

たとえば、ヒープを定義するときに、ユーザーが空のヒープを構築できるようにしたいと考えています。これらの場合、型 T が持つことができる最小値で値を初期化したいと考えています。明らかに、このコードは機能しません。

class Heap[T](val value:T,val heaps:List[Heap[T]]){
    def this()=this(T.MinValue,List())
}

また、本当に優れたオンライン Scala 2.8 リファレンスについてアドバイスをいただければ幸いです。

4

2 に答える 2

6

いくつかのメソッドを共有しているため、すべて大まかに関連しています (ただし、戻り値の型は異なります)。確かに私にはアドホックなポリモーフィズムのように聞こえます!

型クラスにロール...

class HasMinMax[T] {
  def maxValue: T
  def minValue: T
}

implicit object IntHasMinMax extends HasMinMax[Int] {
  def maxValue = Int.MaxValue
  def minValue = Int.MinValue
}

implicit object DoubleHasMinMax extends HasMinMax[Double] {
  def maxValue = Double.MaxValue
  def minValue = Double.MinValue
}

// etc

class C[T : HasMinMax](param : T) {
  val bounds = implicitly[HasMinMax[T]]
  // now use bounds.minValue or bounds.minValue as required
}

アップデート

[T : HasMinMax]表記法はコンテキスト バインドであり、次の構文糖衣です。

class C[T](param : T)(implicit bounds: HasMinMax[T]) {
  // now use bounds.minValue or bounds.minValue as required
}
于 2010-12-02T19:07:10.493 に答える
2

タイプ境界は次のいずれかを使用できます。

trait Base

class C[T <: Base]

のサブタイプであるC任意のタイプでパラメーター化できるようにします。TBase

または、暗黙のパラメーターを使用して要件を表すことができます。

trait Requirement[T] {
  def requiredFunctionExample(t: T): T
}

class C[T](implicit req: Requirement[T])

したがって、クラスのオブジェクトは、それらをパラメーター化するタイプのトレイトCの実装が存在する場合にのみ構築できます。たとえば、パッケージオブジェクトにさまざまなタイプの実装を配置して、対応するパッケージがインポートされるたびにそれらをスコープに含めることができます。RequirementTRequirementT

于 2010-12-02T18:30:33.303 に答える