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)
但现在有一个丑陋的演员作为返回类型
为了让你的UserBuilder子类引用它们自己的类型,你应该声明的类型this(并使它们成为 的子类型,而不是超类型UserBuilder):
trait UserBuilder[T <: UserBuilder[T]] { this: T =>
...
}
Run Code Online (Sandbox Code Playgroud)