Я хочу, чтобы карта, которая бросает попытку переписать значение для существующего ключа. Я пробовал:Расширение коллекции 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)
}
и получил:
<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)
^
Я совершенно новой для Scala и не может придумать способ, чтобы преодолеть это. Любая помощь? :)
редактировать: Я использую Scala 2.8.0.Beta1-пререлиз (который приносит некоторые изменения в scala.collection)
В случае, если это не понятно, почему вы хотите расширить 'collection.mutable.Map', это потому, что когда вы расширяете непреложную карту, каждый вызов' + 'дает вам _new map_. Поскольку вы создаете новую карту с призывом к супер, эта новая карта не будет невосприимчива! Есть два выхода: переопределить все, а не вызовы супер, но с вашими подпрограммами, которые берут старый неизменный unoverwriteable и создают новый с новым элементом (если разрешено); или, используйте измененную карту и продолжайте добавлять к той же карте вместо ее замены. Последнее намного меньше. –