2010-12-02 9 views
3

私はいくつかのパラメータ化されたクラスC [T]を作成しています。私は、T型の特性のいくつかの要件を自分のクラスのパラメータにできるようにしたいと考えています。私は、Tが特質やクラスから継承されていると言いたいのは簡単です(Orderingと同様)。しかし、私はそれもいくつかの機能を実装したい。Scala:ジェネリッククラスの型パラメータの要件を作成するには?

たとえば、私は多くの事前定義された型がMinValueとMaxValueを実装しているのを見てきました。暗黙の関数を定義するだけのアドバイスを受けました。しかし、すでに実装されている場合、すべてのユーザーがこれらの機能を実装することを義務づけられたのは嫌です。私も自分のコードでそれらを実装することができますが、それはちょうど貧弱な迅速な修正であるようです。

たとえば、ヒープを定義するときに、ユーザーが空のヒープを作成できるようにしたいと考えています。これらのケースでは、タイプTが持つ可能性のある最小値で値を定める必要があります。明らかにこのコードは動作しません。

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

また、本当に良いオンラインのScala 2.8リファレンスについてのアドバイスを受けたいと思います。

+0

あなたでした(擬似)コードの例であなたが何をしているのかを明確にしますか?あなたは何を試しましたか、なぜそれは機能しませんでしたか? –

+0

Scalaのリソースへのリンクについては、http://stackoverflow.com/questions/68074/good-way-to-learn-scalaを参照してください。 –

+0

タイプ境界について読んでみてください。コード例があります:https://gist.github.com/257758/47f06f2f3ca47702b3a86c76a5479d096cb8c7ec –

答えて

5

いくつかの方法を共有しているため、すべてが緩やかに関連しています(戻り値の種類は異なりますが)。確かに、私にとってはアドホック多形性のように聞こえるよ!

型クラスのロール...

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 
} 

UPDATE

[T : HasMinMax]表記はをバインド文脈で、ためにシンタックスシュガーです:

class C[T](param : T)(implicit bounds: HasMinMax[T]) { 
    // now use bounds.minValue or bounds.minValue as required 
} 
+0

これは正常な機能では正常です。しかし、私はコンストラクタの内部でそれを使用する際に問題を抱えています...境界が見つからないと言っています – Bruna

+0

私は自分の定義に展開を追加しました。 –

2

あなたはタイプの境界を使用することができ、次のいずれか

trait Base 

class C[T <: Base] 

Baseのサブタイプである任意のタイプTでパラメータ化することがCを可能にします。

それとも、要件表現するために、暗黙のパラメータを使用することができます。

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

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

をあなたがそれらをパラメータ化したいTタイプのRequirement形質の実装が存在する場合はこのように、クラスCのオブジェクトのみを構築することができます。さまざまなタイプのTの実装をRequirementに配置することができます。これにより、対応するパッケージがインポートされるたびにスコープに配置されます。

+0

しかし、それは私が探しているものではありません。 MinValueとMaxValueが既に定義されている場合、それを再定義する必要はありません。それ以上に、私はInt、Double、Char ...をこれらのパラメーターTにしたいと思いますが、それらのどれも私が作成している特性を拡張していません。 – Bruna

+0

問題は 'MinValue'と' MaxValue'は 'Int'、' Char'、...の型が同じではないということです彼らは異なる署名を持っているので、彼らは異なった方法です。つまり、おそらくAnyなどの抽象メソッドを戻して要件の特性を作成してから、基本タイプに対して再定義する必要があります。私はあなたが正しくあなたを理解してくれることを願っています。 – axel22

関連する問題