Scala 实现HashSet

Scala 实现HashSet,scala,Scala,我在哈希集的实现中出现了一些奇怪的编译错误。此代码 class HashSet[A] extends scala.collection.mutable.Set[A] { override def +=(elem: A): HashSet[A] = { /* doing stuff */ this } } 产生以下错误 Error:(15, 16) overriding method += in trait SetLike of type (elem: A)HashSet

我在哈希集的实现中出现了一些奇怪的编译错误。此代码

class HashSet[A] extends scala.collection.mutable.Set[A] {
  override def +=(elem: A): HashSet[A] = {
    /* doing stuff */
    this
  }
}
产生以下错误

Error:(15, 16) overriding method += in trait SetLike of type (elem: A)HashSet.this.type;
 method += has incompatible type
  override def +=(elem: A): HashSet[A] = {
               ^
Error:(15, 16) overriding method += in trait Builder of type (elem: A)HashSet.this.type;
 method += has incompatible type
  override def +=(elem: A): HashSet[A] = {
               ^
Error:(15, 16) overriding method += in trait Growable of type (elem: A)HashSet.this.type;
 method += has incompatible type
  override def +=(elem: A): HashSet[A] = {
               ^

如何修复它们?

您要覆盖的方法是,它具有以下定义:

def +=(elem: A): HashSet.this.type
返回类型是HashSet.this.type。您正在使用一个返回不同类型的方法重写它,
HashSet[a]
。这是不允许的

换句话说:突变可变集合不应只返回任何相同类型的集合,而应返回完全相同的集合(即
this
)。您在方法中正确地返回了
this
,但您可以使返回类型更精确,以明确地声明您不仅返回了任何
HashSet
,还返回了此
HashSet

class HashSet[A] extends scala.collection.mutable.Set[A] {
  override def +=(elem: A):       this.type   = ???
  override def iterator:          Iterator[A] = ???
  override def -=(elem: A):       this.type   = ???
  override def contains(elem: A): Boolean     = ???
}
由于您正在用返回类型
this.type
重写一个方法,因此简单地让Scala推断返回类型也可以:

class HashSet[A] extends scala.collection.mutable.Set[A] {
  override def +=(elem: A)                    = ???
  override def iterator                       = ???
  override def -=(elem: A)                    = ???
  override def contains(elem: A)              = ???
}