我正在创建一些基本的抽象数据类型和算法来复习我的 CS 基础知识,并在此过程中学习 Scala。我的 BinarySearchTree 数据类型遇到了麻烦,这是一个更抽象的 BinaryTree 的实现:
abstract class BinaryTree[T](stored_value: T) {
var contents = stored_value
var l: this.type = _
var r: this.type = _
...
}
class BinarySearchTree[T <: Ordered[T]](stored_value: T) extends BinaryTree(stored_value) {
def insert(newval: T) {
if (newval <= contents) {
if (l == null) {
throw new NotDefinedError("Still trying to work around type erasure.")
} else {
l.insert(newval)
}
} else {
if (r == null) {
throw new NotDefinedError("Still trying to work around type erasure.")
} else {
r.insert(newval)
}
}
}
在抛出 NotDefinedErrors 的块中,我尝试了一些方法,例如l = new this.type(newval)
,替换this.type
以及BinarySearchTree[T]
我能想到的任何其他方法。根据我尝试表达该类型的方式,我会得到类似的东西:
class type required but BinarySearchTree.this.type found
或者:
type mismatch; found : trees.BinarySearchTree[T] required: BinarySearchTree.this.type
我是否需要在 BinarySearchTree 的定义中用不同类型覆盖 l 和 r?或者只是在我为它们附加新值时调用不同类型的构造函数?还是其他选择?