【问题标题】:How to extend mutable Map in Scala如何在 Scala 中扩展可变映射
【发布时间】:2016-01-11 12:07:48
【问题描述】:

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

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

问题在于+= 方法的语法。它说方法+= 什么都不覆盖。如果我将+= 更改为+,则会出现一个问题,即必须将类 Unit 声明为抽象或实现抽象成员 +=

编辑 这是语法正确的

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
}

【问题讨论】:

  • 它想要覆盖 +- 方法,但不是你提到的。
  • 如果我重写方法 +- 它说:必须将类 Unit 声明为抽象或实现抽象成员 -=+=
  • 不分配评估为Unit? IE。返回类型不应该是Unit吗?
  • 我刚刚删除了[T3 &gt;: T2] 并将T3 更改为T2,因为它没有必要,而且语法没问题。问题是我想扩展一个抽象类,这是一堆工作。我会去扩展HashMap,因为我只需要更改一个功能。
  • @Szymon Roziewski 嘿,看看这是否已解决

标签: scala dictionary mutable


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多