Un conte de deux traits qui semblent devraient jouer bien ensemble mais pas et je ne peux pas faire des queues de queue de pourquoi ce code ne fonctionne pas ou ce que l'erreur de compilation est vraiment essayer pour me dire.Génériques avec des types existentiels dans Scala
Alors ... nous avons
Un trait pour les parents ...
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
}
}
et un trait pour les enfants ...
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
}
}
Le pointeur à ERROR indique qu'une incompatibilité de type a été trouvée.
PolyTreeHasChildren.this.type(with underlying type PolyTreeHasChildren[C]) required: _$1 where type _$1
J'aurais pensé que l'ajout
P :< PolyTreeHasParents[_]
me aurait permis d'ajouter une référence aux parents de l'enfant.
Voici la partie bizarre ... à examiner, l'erreur est:
required: _$1 where type _$1
Quoi !?
Hélas ... je suis à court d'idées sur la façon de faire ce travail de code: (
Nice! Travaillé comme un charme! Merci de souligner que le trait ne devrait pas être en mesure d'ajouter un enfant qu'il a déjà ajouté. Faites quelques petits changements ... au lieu de if (Parent == this) ..., changez cela pour require (child! = This). Aussi ... déplacé de listes mutables à celles immuables. – user465342