扩展Scala集合

Art*_*owy 5 generics scala traits extend scala-collections

我想要一个试图覆盖现有密钥值的Map.我试过了:

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)
}
Run Code Online (Sandbox Code Playgroud)

得到了:

<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)
                                                                           ^
Run Code Online (Sandbox Code Playgroud)

我对Scala很陌生,无法找到解决这个问题的方法.有帮助吗?:)

编辑:我正在使用Scala 2.8.0.Beta1-prerelease(它对scala.collection进行了一些更改)

Fab*_*eeg 4

当您重写 中的方法时Map,您无法将您的特征定义为返回类型。

最简单的解决方案是省略类型:

abstract override def + [B1 >: B] (kv: (A, B1)) = { /* ... */ }
// ...
abstract override def -(key: A) = super.-(key)
Run Code Online (Sandbox Code Playgroud)

或者你可以明确地添加超类型:

import scala.collection.Map
abstract override def +[B1 >: B] (kv: (A, B1)): Map[A, B1] = { /* ... */ }
// ...
abstract override def -(key: A) = super.-(key): Map[A, B]
Run Code Online (Sandbox Code Playgroud)

我认为你只需要重写+,因为你的其他方法只委托给Map.