我正在尝试为我的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 =>
...
}