Scala Builder 模式:涉及类型 T 的非法循环引用

Dan*_*nix 5 generics overriding scala class

我正在尝试为我的 User 类层次结构编写一些通用构建器。我有一个特征,UserBuilder,特征中的每个“with”方法都必须返回与当前类相同的类型。因此,如果我在 ComplexUserBuilder 中,withId 方法应该返回 ComplexUserBuilder 而不是 UserBuilder。

但我得到

涉及类型 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)
}
Run Code Online (Sandbox Code Playgroud)

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

类型参数 [model.ComplexUserBuilder] 不符合 trait UserBuilder 的类型参数边界 [T >: model.UserBuilder[_]]

更新:

trait UserBuilder[T >: UserBuilder[T]]
Run Code Online (Sandbox Code Playgroud)

应该是(如 GClaramunt 建议的那样)

trait UserBuilder[T <: UserBuilder[T]]
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*etz 6

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

trait UserBuilder[T <: UserBuilder[T]] { this: T =>
  ...
}
Run Code Online (Sandbox Code Playgroud)