Scala:解决“非法循环引用”

时间:2010-04-28 19:15:57

标签: scala tree types

我正在尝试实现一个基于HashMap的树,该树支持给定根密钥的O(1)子树查找。为了实现这一目标,我正在努力做到以下几点:

scala> type Q = HashMap[Char, Q]
<console>:6: error: illegal cyclic reference involving type Q
       type Q = HashMap[Char, Q]
                          ^

所以问题是,有没有办法让我做一些这样的事情而不诉诸丑陋的HashMap[Char, Any]并随后将值转换为HashMap[Char, Any]

现在,我也看到我可以使用类似下面的内容来避免循环引用错误,甚至可能更干净 - 但是如果能够以第一种方式正确地做到这一点,那就太好了,只是为了教育价值。

import collections.mutable.HashMap

class LTree {
  val children = new HashMap[Char, LTree]
}

非常感谢。

2 个答案:

答案 0 :(得分:16)

我可能没有“得到”这个问题,但是

class L {
  type Q = java.util.HashMap[Char, this.type]
}

class Q extends java.util.HashMap[Char, Q]

答案 1 :(得分:1)

对于您不能extend的类型,例如Either,您还可以使用一个简单的包装器:

class MyEither(get: Either[String, MyEither])

或者,带有Either的递归树(导致我进入这个主题的东西):

// represents (validation) errors for a tree structure of nested dictionaries
type FieldName = String
type Error = String

type Errors = List[(FieldName, FieldError)]
case class FieldError(val get: Either[Error, Errors])

这是伪代码的类型合法版本:

type Error = String
type Errors = List[(FieldName, Either[Error, Errors])]

然后,您的所有Left(...)Right(...)来电将分别成为FieldError(Left(...))FieldError(Right(...)),例如FieldError(Right(x)).get == Right(x)