CSの基礎をブラッシュアップするために、いくつかの基本的な抽象データ型とアルゴリズムを作成し、その過程でScalaを学習しています。より抽象的なBinaryTreeの実装であるBinarySearchTreeデータ型で問題が発生しています。
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)
}
}
}
l = new this.type(newval)
NotDefinedErrorsthis.type
をスローするブロックでは、のようないくつかのアプローチを試しましたBinarySearchTree[T]
。そのタイプをどのように表現しようとするかに応じて、次のようになります。
class type required but BinarySearchTree.this.type found
また:
type mismatch; found : trees.BinarySearchTree[T] required: BinarySearchTree.this.type
BinarySearchTreeの定義でlとrを異なるタイプでオーバーライドする必要がありますか?または、新しい値をアタッチするときに、別のタイプのコンストラクターを呼び出すだけですか?または他のオプション?