Ich möchte eine Map, die versucht, einen Wert für den vorhandenen Schlüssel zu überschreiben. Ich habe versucht:Erweitern einer Scala-Sammlung
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)
}
und bekam:
<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)
^
ich Scala ganz neu bin und kann nicht einen Weg finden, diese zu überwinden. Irgendeine Hilfe? :)
edit: Ich bin mit Scala 2.8.0.Beta1-Prerelease (die einige Änderungen an scala.collection bringt)
Im Fall ist es nicht klar, warum Sie erweitern möchten 'collection.mutable.Map', es ist, weil, wenn Sie eine unveränderliche Karte erweitern, jeder Aufruf von '+' gibt Ihnen einen _new map_. Da Sie die neue Karte mit einem Aufruf von super erstellen, ist diese neue Karte nicht überschreibbar! Es gibt zwei Möglichkeiten: überschreiben Sie alles nicht mit Aufrufen von Super, sondern mit Ihren eigenen Routinen, die ein altes unveränderbares nicht überschreibbares nehmen und ein neues mit dem neuen Element erstellen (falls erlaubt); oder verwenden Sie eine veränderbare Map und fügen Sie sie der gleichen Map hinzu, anstatt sie zu ersetzen. Letzteres ist viel weniger Arbeit. –