如何在Scala中扩展可变映射

如何在Scala中扩展可变映射,scala,dictionary,mutable,Scala,Dictionary,Mutable,我想在Scala中扩展可变映射,因为在添加新元组时需要一些特殊行为。 我有以下几点 package my.package import collection.mutable.Map class Unit[T1,T2](map: Map[T1,T2]) extends Map[T1,T2]{ override def get(key: T1): Option[T2] = super.get(key) override def iterator: Iterator[(T1, T2)] =

我想在Scala中扩展可变映射,因为在添加新元组时需要一些特殊行为。 我有以下几点

package my.package
import collection.mutable.Map

class Unit[T1,T2](map: Map[T1,T2]) extends Map[T1,T2]{
  override def get(key: T1): Option[T2] = super.get(key)
  override def iterator: Iterator[(T1, T2)] = super.iterator
  override def -=(key: T1): Map[T1, T2] = super.-(key)
  override def +=[T3 >: T2] (kv: (T1, T3)): Map[T1, T3] = super.+[T3](kv)
}
问题在于
+=
方法的语法。它表示方法
+=
不覆盖任何内容。如果我将
+=
更改为
+
,则存在一个问题,即类单元必须声明为抽象的,或者实现抽象成员
+=

编辑 这在句法上是正确的

class Unit[T1,T2] extends Map[T1,T2]{
  override def get(key: T1): Option[T2] = super.get(key)
  override def iterator: Iterator[(T1, T2)] = super.iterator
  override def -=(key: T1): Map[T1, T2] = super.-(key)
  override def += (kv: (T1, T2)): Map[T1, T2] = super.+[T2](kv)
}
但最好扩展HashMap而不是Map,Map是一个特性,因为我只需要更改一个函数来添加新的元组

编辑 下面是我想要的

import collection.mutable.HashMap
import scala.math.{log,ceil}

class Unit[T1>:String,T2>:String] extends HashMap[T1,T2]{
  override def +=(kv: (T1, T2)): this.type = {
    val bits = ceil(log2(this.size)).toInt match {
      case x: Int if (x < 5) => 5
      case x => x
    }

    val key = Range(0,(bits - this.size.toBinaryString.size)).foldLeft("")((a,_)=>a+"0")+this.size.toBinaryString
    this.put(kv._1, key)
    this
  }
  val lnOf2 = log(2) // natural log of 2
  def log2(x: Double): Double = log(x) / lnOf2
}
import collection.mutable.HashMap
导入scala.math.{log,ceil}
类单元[T1>:String,T2>:String]扩展了HashMap[T1,T2]{
覆盖def+=(kv:(T1,T2)):this.type={
val bits=ceil(log2(this.size)).toInt匹配{
案例x:Int如果(x<5)=>5
案例x=>x
}
val key=Range(0,(bits-this.size.toBinaryString.size)).foldLeft(“”)(a,)=>a+“0”)+this.size.toBinaryString
此输入(千伏1,键)
这
}
val lnOf2=log(2)//2的自然对数
def log2(x:Double):Double=log(x)/lnOf2
}

它应该被命名为
+=
,但是它的返回类型必须是Unit(因为它是一个可变映射),并且您正在尝试返回一个映射。请注意,您的类名为Unit,因此在这里要小心。

它应该被命名为
+=
,但它的返回类型必须是Unit(因为它是一个可变映射),并且您正在尝试返回一个映射。请注意,您的类是命名为Unit的,因此在这里要小心。

它需要重写
+
-
方法,但并不是因为你们提到的。若我重写方法
+
-
,它会说:类单元必须声明为抽象的,或者实现抽象成员
-=
+=
赋值不计算为
单元
?也就是说,返回类型不应该是
Unit
?我刚刚删除了
[T3>:T2]
,并将
T3
更改为
T2
,因为它不是必需的,语法也没有问题。问题是我想扩展一个抽象类,这是一堆工作。我想扩展
HashMap
,因为我只需要更改一个函数。@Szymon Roziewski嘿,正在检查这是否是resolvedit想要覆盖
+
-
方法,但并不是因为你们提到的。若我重写方法
+
-
,它会说:类单元必须声明为抽象的,或者实现抽象成员
-=
+=
赋值不计算为
单元
?也就是说,返回类型不应该是
Unit
?我刚刚删除了
[T3>:T2]
,并将
T3
更改为
T2
,因为它不是必需的,语法也没有问题。问题是我想扩展一个抽象类,这是一堆工作。我想扩展
HashMap
,因为我只需要更改一个函数。@Szymon Roziewski嘿,正在检查这个问题是否得到解决