加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

class – Scala Builder Pattern:涉及类型T的非法循环引用

发布时间:2020-12-16 09:53:51 所属栏目:安全 来源:网络整理
导读:我正在尝试为我的User类层次结构编写一些通用构建器. 我有一个特性,UserBuilder和特征中的每个“with”方法必须返回与当前类相同的类型.因此,如果我在ComplexUserBuilder中,withId方法应返回ComplexUserBuilder而不是UserBuilder. 但我得到了 illegal cyclic
我正在尝试为我的User类层次结构编写一些通用构建器.
我有一个特性,UserBuilder和特征中的每个“with”方法必须返回与当前类相同的类型.因此,如果我在ComplexUserBuilder中,withId方法应返回ComplexUserBuilder而不是UserBuilder.

但我得到了

illegal cyclic reference involving type T

有办法解决这个问题吗?

这是我的代码:

trait UserBuilder[T >: UserBuilder[T]] {

  var id: String = ""

  def withId(id: String): T = {
    this.id = id
    return this
  }
}

class ComplexUserBuilder extends UserBuilder[ComplexUserBuilder] {

  var username: String = ""

  def withUsername(username: String): ComplexUserBuilder = {
    this.username = username
    return this
  }

  def build = new ComplexUser(id,username)
}

顺便说一句,如果我用特征UserBuilder [T>:UserBuilder [_]]替换trait UserBuilder [T>:UserBuilder [T]],我得到:

type arguments [model.ComplexUserBuilder] do not conform to trait UserBuilder’s type parameter bounds [T >: model.UserBuilder[_]]

更新:

trait UserBuilder[T >: UserBuilder[T]]

应该是(如GClaramunt建议)

trait UserBuilder[T <: UserBuilder[T]]

但现在有一个丑陋的演员作为回归类型

解决方法

为了让你的UserBuilder子类具有对它们自己类型的引用,你应该声明它的类型(并使它们成为UserBuilder的子类型,而不是超类型):

trait UserBuilder[T <: UserBuilder[T]] { this: T =>
  ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读