我有一个容器类型,它的类型参数是协变的。
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 先生在他的回答中所写的内容有关,即Set
s 和Map
s 在相关参数中是不变的。
为什么 Scala 的不可变 Set 在其类型上不是协变的?
Set
然而,我有点惊讶地发现包含返回类型为 T 的keySet 没有问题。
我能够通过写作部分解决这个问题
lazy val freqs:Map[_ <: Any, Int] =
(map.toList groupBy (x=>x._2) mapValues(_.size))
但这并不理想,因为密钥类型显示为 Any。我也想说
lazy val uniqueValues = freqs.keySet
并得到 aSet[T]
而不是 aSet[Any]
- 我怎样才能最好地实现
freqs
上述? keySet
其他方法失败时如何返回 Set[T]?- 如何
Set[T]
在地图中获得唯一值? - 为什么 _ <: Any 允许它编译?
谢谢!