簡體   English   中英

Scala逆向困難

[英]Scala contravariance difficulties

我是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方法。 如果您還沒有這樣做,您可能希望熟悉從ScalaDoc鏈接的HashMap的源代碼。

你可以使你的類不可變。

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)
  ...
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM