web-dev-qa-db-ja.com

再帰値xxxには、Scala

Scalaがこのコードについて不平を言っている。混乱している。互いに依存する2つのクラスがある。型宣言なしでAの新しいインスタンスを作成しようとすると、コードはコンパイルされません。

  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

new Aとして宣言したときに、コンパイラがyのタイプを認識しないのはなぜですか?

17
Jay

yのタイプを推測するには、コンパイラーは最初に割り当ての右側の値のタイプを決定する必要があります。右手の型を評価しているときに、変数yへの参照に遭遇します。この変数は(現時点では)未知の型です。このため、コンパイラは「yのタイプはyのタイプに依存する」というサイクルを検出して失敗します。

2番目の例では、new A(new B(y))のタイプを評価するときに、yのタイプをすでに知っていて成功するため、このような状況は発生しません。

編集:再帰的に使用される変数yのタイプに混合特性を含める必要がある場合、次のように宣言できます。

val y : A with Mixin = new A(new B(y)) with Mixin
13
Mifeet

yのタイプを具体的に指定すると、コンパイルされます:

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