【发布时间】:2011-08-10 00:18:36
【问题描述】:
我在 Scala 类型系统中遇到了某种怪癖,这让我有点难过。我正在尝试创建一个扩展 Map[String,String] 的类,但我无法弄清楚如何以编译器接受它的方式实现 + 方法。
这是我现在拥有的代码:
class ParamMap(val pairs:List[(String,String)] = Nil) extends Map[String,String] {
lazy val keyLookup = Map() ++ pairs
override def get(key: String): Option[String] = keyLookup.get(key)
override def iterator: Iterator[(String, String)] = pairs.reverseIterator
/**
* Add a key/value pair to the map
*/
override def + [B1 >: String](kv: (String, B1)) = new ParamMap(kv :: pairs)
/**
* Remove all values for the given key from the map
*/
override def -(key: String): ParamMap = new ParamMap(pairs.filterNot(_._1 == key))
/**
* Remove a specific pair from the map
*/
def -(kv: (String, String)) : ParamMap = new ParamMap(pairs - kv)
}
Scala 告诉我:
type mismatch; found: (String, B1) required: (String, String)
我相信这是因为允许 B1 是 String 的子类型,但我的构造函数只需要一个 String (?)。我最初的尝试是:
override def +(kv: (String, String)) = new ParamMap(kv :: pairs)
但这抱怨是因为类型签名与特征不匹配:
class ParamMap needs to be abstract, since method + in trait Map of type [B1 >: String](kv: (String, B1))scala.collection.immutable.Map[String,B1] is not defined
method + overrides nothing
我是 Scala 的新手,我想我在类型系统的工作方式方面已经过头了。也许我会尝试弄乱选角,但我觉得可能有一种“更好的方法”,如果我知道的话,将来会为我省去很多麻烦。
有什么想法吗?
【问题讨论】: