我想要一個映射拋出嘗試覆蓋現有密鑰的值。我想:擴展一個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_。由於您正在通過調用super來創建新地圖,因此新地圖不會無法覆蓋!有兩種方法:重寫所有內容,而不是調用super,但用自己的例程取代舊的不可改寫的不可重寫的,並用新元素創建一個新的元素(如果允許);或者,使用可變映射並繼續添加到相同的映射而不是替換它。後者是少得多的工作。 – 2010-02-14 19:09:36