J'essaie de définir un conteneur générique dont les éléments peuvent renvoyer le conteneur englobant. Quelque chose comme:Définition des paramètres de type circulaire dans scala
abstract class Container[E <: Element] { // compile error
def contains(e: E): Boolean
def addNewElement(): Unit
}
abstract class Element[C <: Container] { // compile error
def enclosingContainer(): C
}
class MyContainer extends Container[MyElement] {
private var elements = List[MyElement]()
override def contains(elem: MyElement) = elements.contains(elem)
override def addNewElement() { elements ::= new MyElement(this) }
}
class MyElement(container: MyContainer) extends Element[MyContainer] {
override val enclosingContainer = container
}
Cependant cet extrait ne compile pas parce que je devrais donner un paramètre de type à Element
dans la définition abstract class Container[E <: Element]
et un type à Container
dans la définition abstract class Element[C <: Container]
.
Y a-t-il un moyen d'atteindre le comportement que je recherche? Y a-t-il une déclaration appropriée pour Container
et Element
? Dois-je définir un objet tiers?
estimation grossière que je ne peux pas ouvrir mon compilateur à la minute, mais avez-vous essayé 'classe abstraite élément [C <: Container [élément]] 'ou quelque chose de similaire? – wheaties
Oui, mais alors 'Element' a aussi besoin d'un type de paramètre ... – paradigmatic
'addNewElement()' ne devrait-il pas prendre un élément à ajouter? C'est, 'addNewElement (e: E)'? –