Quiero un mapa que arroja al intentar sobreescribir un valor para la clave existente. Probé:Extendiendo una colección de 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)
}
y tengo:
<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)
^
Soy bastante nuevo en Scala y no puedo encontrar una manera de superar esto. ¿Alguna ayuda? :)
editar: Estoy usando Scala-2.8.0.Beta1 preliminar (que trae algunos cambios en scala.collection)
En caso de que no está claro por qué desea ampliar 'collection.mutable.Map', es porque cuando extiende un mapa inmutable, cada llamada a' '+ le da una mapa_ _new. ¡Ya que está creando el nuevo mapa con una llamada a super, ese nuevo mapa no será irrevocable! Hay dos formas de salir: anular todo, no con llamadas al súper, sino con sus propias rutinas que toman un viejo inmutable no verificable y crear uno nuevo con el nuevo elemento (si está permitido); o bien, use un mapa mutable y siga agregando al mismo mapa en lugar de reemplazarlo. Este último es mucho menos trabajo. –