Я сталкиваюсь с какой-то причудой в системе типов 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 и думаю, что получаюнад моей головой здесь с точки зрения того, как работает система типов.Возможно, я попытаюсь возиться с кастингом, но у меня есть ощущение, что может быть «лучший способ», который, если я это знаю, избавит меня от многих неприятностей в будущем.
Есть идеи?