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

但是我越来越



有办法解决此问题吗?

这是我的代码:

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

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



更新:
trait UserBuilder[T >: UserBuilder[T]]

应该是(如GClaramunt建议的那样)
trait UserBuilder[T <: UserBuilder[T]]

但是现在有一个丑陋的 Actor 作为返回类型

最佳答案

为了使UserBuilder子类引用自己的类型,您应该声明this的类型(并使其成为UserBuilder的子类型,而不是父类(super class)型):

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

09-26 22:28