特征创建自身对象时的StackoverFlow错误

时间:2014-12-14 09:41:23

标签: scala traits

我正在尝试定义一个扩展特征的User对象。特征包含用户对象的集合。当我尝试创建新用户时。我得到Stackoverflow错误,我无法理解为什么

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class User(email:String) extends userTrait


trait userTrait {
  self:User =>
  val administrators = new User("test@ab.com")::new User("test2@ab.com")::Nil
  def isAdminstrator = administrators.contains(this)
}

// Exiting paste mode, now interpreting.

defined class User
defined trait userTrait

scala> new User("test")
java.lang.StackOverflowError
  ... 1024 elided

2 个答案:

答案 0 :(得分:3)

“如何初始化该集合?” 您只需将val administrators添加到lazy

即可
trait userTrait {
  self: User =>
  /* >>> */ lazy val administrators = 
    new User("test@ab.com") :: new User("test2@ab.com") :: Nil
  def isAdminstrator = administrators.contains(this)
}
case class User(email: String) extends userTrait

println(new User("test").isAdminstrator)
// prints false
println(new User("test@ab.com").isAdminstrator)
// prints true

答案 1 :(得分:2)

这里有一个循环条件。 User extends userTrait(实习生初始化new User ...