我正在尝试实现一个基于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]
}
非常感谢。
答案 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)
。