gpt4 book ai didi

class - Scala 生成器模式 : illegal cyclic reference involving type T

转载 作者:行者123 更新时间:2023-12-04 23:01:05 24 4
gpt4 key购买 nike

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

但我得到

illegal cyclic reference involving type 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[_]]我得到:

type arguments [model.ComplexUserBuilder] do not conform to trait UserBuilder's type parameter bounds [T >: model.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 =>
...
}

关于class - Scala 生成器模式 : illegal cyclic reference involving type T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com