2012-02-27 49 views
0

我的一個類是泛型的,並將iv定義爲MHashMap[DateTime, T]MHashMapscala.collection.mutableHashMap的別名。然後,我用這個代碼暴露最少搜尋功能沒有爲Int定義的隱式排序(Scala)

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

我不確定是什麼導致了錯誤,但上面的代碼不幸的是由於類型擦除不起作用。不能在類型參數上「匹配」,只能在類型構造函數上匹配。 – Owen 2012-02-27 14:20:08

回答

2

那麼,Int <: T with Int。現在,如果您要使用Ordering[Int],那麼您需要Ordering[T with Int] <: Ordering[Int],這意味着Ordering必須是逆變。不幸的是,Ordering不是逆變(儘管它可以 - 而且它在斯卡拉茲)。

+0

你確定嗎?我不太明白,也沒有辦法檢查,但是如果你確定這是導致問題的原因,我想接受答案。實際上,我已經爲自己解決了這個問題,但這是一種無關緊要的方式。 – Ivan 2012-02-27 15:09:14

+0

@Ivan我只是解釋爲什麼'Ordering [Int]'不能用於'Ordering [T with Int]'。 Owen說的 - 你無法在類型參數上匹配 - 是正確的,所以這種方法註定要開始。另外,我不知道爲什麼'T'出現 - 但你沒有問這個。 :-) – 2012-02-27 18:48:35

相關問題