2012-05-12 30 views
5

これら2つの単純なインターバルクラスのボイラープレート排除スーパークラスを定義するにはどうすればよいですか?スカラ実間隔、Int間隔

class IntInterval(val from: Int, val to: Int) { 
    def mid: Double = (from+to)/2.0 
    def union(other: IntInterval) = IntInterval(from min other.from, to max other.to) 
} 

class DoubleInterval(val from: Double, val to: Double) { 
    def mid: Double = (from+to)/2.0 
    def union(other: DoubleInterval) = DoubleInterval(from min other.from, to max other.to) 
} 

私は

class Interval[T <: Number[T]] (val from: T, val to: T) { 
    def mid: Double = (from.doubleValue+to.doubleValue)/2.0 
    def union(other: IntInterval) = Interval(from min other.from, to max other.to) 
} 

を試みたが、(数[T]が最小/最大を持っていないので)最大組合方法ではコンパイルできませんでした。

はあなたが半ば組合端正で方法の両方を扱うエレガントなスーパークラスを提供することができ、定型回避方法コード-once-and-only-onceの?

答えて

4

私はあなたがscala.math.Numeric型クラスを探していると思う:

class Interval[T] (val from: T, val to: T)(implicit num: Numeric[T]) { 
    import num.{mkNumericOps, mkOrderingOps} 

    def mid: Double = (from.toDouble + to.toDouble)/2.0 
    def union(other: Interval[T]) = new Interval(from min other.from, to max other.to) 
} 
+0

Mhhh。 2.9.2で確認しましたが、問題はありませんでした。あなたのエラーメッセージは何ですか? (あなたは 'num num ...'を忘れましたか?) – soc

+0

ありがとうございました!それは完璧に働いた。 –