gpt4 book ai didi

Scala 逆变困难

转载 作者:行者123 更新时间:2023-12-01 11:04:36 27 4
gpt4 key购买 nike

我是 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()
}

谁能告诉我在这种情况下我该怎么办?

最佳答案

问题是(值类型)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 的源代码。 .

关于Scala 逆变困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com