web-dev-qa-db-fra.com

La valeur récursive xxx doit être saisie Scala

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?

17
Jay

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
13
Mifeet

Vous pouvez spécifier le type de y spécifiquement et il compilera:

 val y : A = new A(new B(y))
3
Chirlo