【发布时间】:2014-06-11 22:20:43
【问题描述】:
我正在尝试为我的用户类层次结构编写一些通用构建器。 我有一个特征,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)
}
顺便说一句,如果我将 trait UserBuilder[T >: UserBuilder[T]] 替换为 trait UserBuilder[T >: UserBuilder[_]] 我会得到:
类型参数 [model.ComplexUserBuilder] 不符合 trait UserBuilder 的类型参数界限 [T >: model.UserBuilder[_]]
更新:
trait UserBuilder[T >: UserBuilder[T]]
应该(正如 GClaramunt 建议的那样)
trait UserBuilder[T <: UserBuilder[T]]
但是现在有一个丑陋的类型作为返回类型
【问题讨论】:
-
我认为你的方差注释是错误的。不应该是
trait UserBuilder[T <: UserBuilder[T]] {吗? (注意<:与>:) -
你能解释一下你想要达到的目标吗? ComplexUser 类在哪里?
-
ComplexUser 类不相关
case class ComplexUser(id: String, username: String)
标签: class scala generics overriding