【发布时间】:2013-02-06 03:54:59
【问题描述】:
我有一个容器类型,它的类型参数是协变的。
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 uncommented 进行编译时出错的原因与 Spiewak 先生在他的回答中所写的内容有关,Sets 和 Maps 在相关参数中是不变的.
Why is Scala's immutable Set not covariant in its type?
但是我有点惊讶地发现包含 keySet 没有问题,它返回一个类型为 T 的Set。
我可以通过写作部分解决这个问题
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]的唯一值? - 为什么 _ <: any>
谢谢!
【问题讨论】:
-
看起来
Map是落后的。知道频率都是不同的吗? -
这里提到了两张地图,都没有落后。第一个 Map 是 Container 参数,一个 Map[Int, T]:每个 Int 是一个 T 的别名。第二个映射是 freqs 的返回类型, Map[T, Int] 是别名数量的计数对于每个 T。
标签: scala collections types covariance