class – Scala Builder Pattern:涉及类型T的非法循环引用
发布时间:2020-12-16 09:53:51 所属栏目:安全 来源:网络整理
导读:我正在尝试为我的User类层次结构编写一些通用构建器. 我有一个特性,UserBuilder和特征中的每个“with”方法必须返回与当前类相同的类型.因此,如果我在ComplexUserBuilder中,withId方法应返回ComplexUserBuilder而不是UserBuilder. 但我得到了 illegal cyclic
我正在尝试为我的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) } 顺便说一句,如果我用特征UserBuilder [T>:UserBuilder [_]]替换trait UserBuilder [T>:UserBuilder [T]],我得到:
更新: trait UserBuilder[T >: UserBuilder[T]] 应该是(如GClaramunt建议) trait UserBuilder[T <: UserBuilder[T]] 但现在有一个丑陋的演员作为回归类型 解决方法
为了让你的UserBuilder子类具有对它们自己类型的引用,你应该声明它的类型(并使它们成为UserBuilder的子类型,而不是超类型):
trait UserBuilder[T <: UserBuilder[T]] { this: T => ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |