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
のタイプを認識しないのはなぜですか?
y
のタイプを推測するには、コンパイラーは最初に割り当ての右側の値のタイプを決定する必要があります。右手の型を評価しているときに、変数y
への参照に遭遇します。この変数は(現時点では)未知の型です。このため、コンパイラは「y
のタイプはy
のタイプに依存する」というサイクルを検出して失敗します。
2番目の例では、new A(new B(y))
のタイプを評価するときに、y
のタイプをすでに知っていて成功するため、このような状況は発生しません。
編集:再帰的に使用される変数y
のタイプに混合特性を含める必要がある場合、次のように宣言できます。
val y : A with Mixin = new A(new B(y)) with Mixin
y
のタイプを具体的に指定すると、コンパイルされます:
val y : A = new A(new B(y))