首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现HashSet

实现HashSet
EN

Stack Overflow用户
提问于 2014-07-31 08:21:22
回答 1查看 96关注 0票数 0

在哈希集的实现中有一些奇怪的编译错误。这段代码

代码语言:javascript
复制
class HashSet[A] extends scala.collection.mutable.Set[A] {
  override def +=(elem: A): HashSet[A] = {
    /* doing stuff */
    this
  }
}

产生下列错误

代码语言:javascript
复制
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] = {
               ^

我怎么才能治好他们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 09:18:04

要重写的方法是HashSet.+=,它具有以下定义:

代码语言:javascript
复制
def +=(elem: A): HashSet.this.type

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

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

代码语言:javascript
复制
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推断返回类型也会有效:

代码语言:javascript
复制
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)              = ???
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25054044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档