我有一個對其類型參數協變的Container類型。返回具有協變類型的immutable.Map
class Container[+T](val map: Map[Int, T] = Map.empty[Int, T]){
def add[B >: T](i: Int, b: B) = new Container(map + (i->b))
// lazy val freqs = (map.toList groupBy (x=>x._2) mapValues(_.size))
// lazy val uniq = map.toSet
lazy val keySet = map.keySet
}
我在想,我得到的錯誤嘗試與freqs或uniq的註釋掉編譯的原因有什麼Spiewak先生在他的答案寫在這裏做的,那Set
S和Map
s爲在相關參數不變。
Why is Scala's immutable Set not covariant in its type?
不過我有點驚訝地發現,這是沒有問題的,包括它的keySet不會返回一個Set
,其類型爲T.
我能夠部分通過寫
解決此lazy val freqs:Map[_ <: Any, Int] =
(map.toList groupBy (x=>x._2) mapValues(_.size))
但是這並不理想,因爲密鑰類型出現爲Any。我希望能夠還說
lazy val uniqueValues = freqs.keySet
,並獲得Set[T]
代替Set[Any]
- 我怎樣才能最好地實現
freqs
如上? keySet
在其他方法失敗時如何返回Set [T]?- 如何在Map中獲得唯一值的
Set[T]
? - 爲什麼_ <:任何允許這個編譯?
謝謝!
就好像'Map'是落後的。知道頻率都是不同的? – 2013-02-20 23:54:06
提到了兩張地圖,都不是落後的。第一個Map是Container參數,一個Map [Int,T]:每個Int是T的別名。第二個map是freqs的返回類型,Map [T,Int]是別名數的計數對於每個T. – scalapeno 2013-02-21 00:12:07