Je ne comprends pas pourquoi Scala se plaint de ce code. J'ai deux classes qui dépendent l'une de l'autre. Lorsque j'essaie de créer une nouvelle instance de A
sans déclaration de type , le code ne se compilera pas.
class A( b:B ) {
}
class B( a:A ){
}
val y = new A ( new B( y ) ); // gives recursive value y needs type
val z:A = new A ( new B( y ) ); // ok
Pourquoi le compilateur ne connaît-il pas le type de y
quand j'ai déclaré que new A
?
Pour déduire le type de y
, le compilateur doit d'abord déterminer le type de valeur sur le côté droit de l'affectation. Lors de l'évaluation du type de droite, il rencontre une référence à la variable y
qui est (à ce moment) encore de type inconnu. Ainsi, le compilateur détecte un cycle "le type de y
dépend du type de y
" et échoue.
Dans le deuxième exemple, cette situation ne se produit pas car lors de l'évaluation du type de new A(new B(y))
, il connaît déjà le type de y
et réussit.
Edit: lorsque le type de variable récursivement utilisée y
doit inclure un trait mixte, elle peut être déclarée comme ceci:
val y : A with Mixin = new A(new B(y)) with Mixin
Vous pouvez spécifier le type de y
spécifiquement et il compilera:
val y : A = new A(new B(y))