我是Scala的新手,所以我开始用Scala重写我的旧代码。现在,我正在重写一个Map,它包含一些值和它们的修改(如添加、删除等)的“历史”:
import scala.collection.immutable._
class Storage[A,+B](private var oldValues: Map[A,B]) extends Map[A,B] {
private var addedValues = new HashMap[A,B]
private var modifiedValues = new HashMap[A,B]
private var deletedValues = new HashSet[A]
}当我覆盖方法"+“时,我不能编译它:
override def +[B1 >: B](kv: (A,B1)) = {
deletedValues = deletedValues - kv._1
addedValues = addedValues + kv //type mismatch; found : (A, B1) required: (A, B)
modifiedValues = modifiedValues + kv //type mismatch; found : (A, B1) required: (A, B)
currentValues()
}有人能告诉我在这种情况下我能做些什么吗?
发布于 2011-08-28 08:18:59
问题是(值类型) B的协方差。既然您使用的是可变状态,那么您可能应该使用可变的Map特征,它在类型B中无论如何都不是协变的。扩展HashMap实现怎么样?下面的代码可以编译,但我还没有测试它。
import collection.mutable._
class Storage[A,B](private var oldValues: Map[A,B]) extends HashMap[A,B] {
private var addedValues: Map[A,B] = new HashMap[A,B]
private var modifiedValues: Map[A, B] = new HashMap[A,B]
private var deletedValues: Set[A] = new HashSet[A]
// Overriding this method will redefine the behavior of HashMap.put and HashMap.+=
override def addEntry(e: DefaultEntry[A, B]) {
super.addEntry(e)
// your extension code below
val kv = (e.key, e.value)
deletedValues -= kv._1
addedValues += kv
modifiedValues += kv
// currentValues() // not defined yet
}
}像storage += (key, value)这样的调用将使用修改后的addEntry方法。如果您还没有这样做,您可能想要熟悉从the ScalaDoc链接的HashMap源代码。
发布于 2011-08-28 17:59:57
你可以让你的类变得不可变。
import scala.collection.immutable._
class Storage[A,+B] private (
val oldValues: Map[A,B] = Map(),
val addedValues: Map[A, B] = Map(),
val modifiedValues: Map[A, B] = Map(),
val deletedValues: Set[A] = Set()) extends Map[A,B] {
override def +[B1 >: B](kv: (A,B1)) =
new Storage(oldValues,
addedValues + kv,
modifiedValues + kv,
deletedValues - kv._1)
...
} https://stackoverflow.com/questions/7218003
复制相似问题