2012-02-27 13 views
0

私のクラスはgenericであり、ivMHashMap[DateTime, T]と定義しています。 MHashMapscala.collection.mutableHashMapの別名です。それから私は、最低限の発見機能Int(Scala)でTに対して暗黙の順序付けが定義されていません

def minimum: BigDecimal = { 
    iv match { 
    case dtMcM: MHashMap[DateTime, MyCustomClass] => dtMcM.minBy(_._2.bdField)._2.bdField 
    case dtBdM: MHashMap[DateTime, BigDecimal] => dtBdM.minBy(_._2)._2 
    case dtDlM: MHashMap[DateTime, Double] => dtDlM.minBy(_._2)._2.toBigDecimal 
    case dtItM: MHashMap[DateTime, Int] => dtItM.minBy(_._2)._2 
    case _ => throw new IllegalArgumentException("Unsupported underlying type") 
    } 
} 

を公開するために、このコードを使用しますが、コンパイラは文句:

No implicit Ordering defined for T with Int. 
case dtItM: MHashMap[DateTime, Int] => dtItM.minBy(_._2)._2 

そしてDoubleBigDecimal例に同じ。

コンパイラがデフォルトの順序付けを適用するためにIntを認識することさえできないのはどうですか?不思議なことは、自分のカスタムクラスのBigDecimalフィールドに問題があるように思われないことです。

+4

エラーの原因はわかりませんが、上記のコードは残念ながらタイプ消去のために動作しません。型コンストラクタでのみ型パラメータに 'match'することはできません。 – Owen

答えて

2

まあ、Int <: T with Int。ここでOrdering[Int]を使用する場合は、Ordering[T with Int] <: Ordering[Int]が必要です。つまり、Orderingは反変的でなければなりません。残念ながら、Orderingは(たとえそれがScalazにあったとしても)反反則ではありません。

+0

本当ですか?私は本当に理解していないし、チェックする方法がないが、これが問題の原因であると確信しているならば、答えを受け入れたいと思う。実際に私は自分のために問題を解決しましたが、無関係の方法です。 – Ivan

+0

@Ivan私は 'Ordering [Int]'を 'Ordering [T with Int] 'に使用できない理由を説明しています。オーウェンが言ったことは、型パラメータにはマッチできないということです - 正しいのですから、このアプローチはまず失敗します。また、なぜTが現れているのか分かりませんが、あなたはそれについて質問しませんでした。 :-) –

関連する問題