Je souhaite une carte qui essaie de remplacer une valeur pour une clé existante. J'ai essayé:Extension d'une collection Scala
trait Unoverwriteable[A, B] extends scala.collection.Map[A, B] {
case class KeyAlreadyExistsException(e: String) extends Exception(e)
abstract override def + [B1 >: B] (kv: (A, B1)): Unoverwriteable[A, B1] = {
if (this contains(kv _1)) throw new KeyAlreadyExistsException(
"key already exists in WritableOnce map: %s".format((kv _1) toString)
)
super.+(kv)
}
abstract override def get(key: A): Option[B] = super.get(key)
abstract override def iterator: Iterator[(A, B)] = super.iterator
abstract override def -(key: A): Unoverwriteable[A, B] = super.-(key)
}
et a obtenu:
<console>:11: error: type mismatch;
found : scala.collection.Map[A,B1]
required: Unoverwirteable[A,B1]
super.+(kv)
^
<console>:16: error: type mismatch;
found : scala.collection.Map[A,B]
required: Unoverwirteable[A,B]
abstract override def -(key: A): Unoverwirteable[A, B] = super.-(key)
^
Je suis tout à fait nouveau pour Scala et ne peut pas trouver un moyen de surmonter cela. De l'aide? :)
edit: J'utilise Scala 2.8.0.Beta1-préversion (qui apporte quelques modifications à scala.collection)
Dans le cas où on ne sait pas pourquoi vous voulez étendre 'collection.mutable.Map', c'est parce que lorsque vous étendez une carte immuable, chaque appel à' '+ vous donne un map_ de _NEW. Puisque vous créez la nouvelle carte avec un appel à super, cette nouvelle carte ne sera pas inscriptible! Il y a deux solutions: remplacer tout ce qui n'est pas par des appels à super mais avec vos propres routines qui prennent une ancienne invendable immutable et en créer une nouvelle avec le nouvel élément (si autorisé); ou, utilisez une carte modifiable et continuez d'ajouter à la même carte au lieu de la remplacer. Ce dernier est beaucoup moins de travail. –