Рассказ о двух чертах, которые кажутся похожими, должен хорошо сочетаться, но это не так, и я не могу понять, почему этот код не работает или что ошибка компиляции ДЕЙСТВИТЕЛЬНО пытается сказать мне.
Итак ... у нас есть
Черта для родителей ...
trait PolyTreeHasParents[P <: PolyTreeHasChildren[_]] {
val _parents: ListBuffer[P] = ListBuffer()
def isRootNode = _parents.size == 0
def parents: List[P] = _parents.readOnly
def addParent(parent: P): PolyTreeHasParents[P] = {
println(parent)
if (parent == this)
throw new IllegalArgumentException()
_parents += parent
//
this
}
}
и черта для детей ...
trait PolyTreeHasChildren[C <: PolyTreeHasParents[_]] {
val _children: ListBuffer[C] = ListBuffer()
def isLeafNode = children == ListBuffer()
def children: List[C] = _children.readOnly
def += (child: C) : PolyTreeHasChildren[C] = {
addChild(child)
}
def addChild(child: C): PolyTreeHasChildren[C] = {
if (child == this)
throw new IllegalArgumentException()
_children += child
child.addParent(this) // <= ERROR HERE
this
}
}
Указатель на ОШИБКУ сообщает, что найдено несоответствие типов.
PolyTreeHasChildren.this.type(with underlying type PolyTreeHasChildren[C]) required: _$1 where type _$1
Я бы подумал, что добавление
P :< PolyTreeHasParents[_]
позволил бы мне добавить ссылку на родителей ребенка.
Вот странная часть ... для обзора, ошибка:
required: _$1 where type _$1
Что !?
Увы ... У меня закончились идеи, как заставить этот код работать: (