Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive value xxx needs type in Scala

Tags:

I am confused about why Scala is complaining about this code. I have two classes which depend on each other. When I try to create a new instance of A without a type declaration, the code won't compile.

  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

Why does the compiler does not know the type of y when I declared as new A ?

like image 940
Jay Avatar asked Aug 26 '15 12:08

Jay


1 Answers

To infer the type of y, the compiler must first determine the type of value on the right side of assignment. While evaluating right hand's type, it encounters reference to variable y which is (at this moment) still of unknown type. Thus the compiler detects a cycle "type of y dependes on type of y" and fails.

In the second example, this situation doesn't occur because when evaluating type of new A(new B(y)), it already knows the type of y and succeeds.

Edit: when the type of recursively used variable y needs to include a mixed-in trait, it can be declared like this:

val y : A with Mixin = new A(new B(y)) with Mixin
like image 87
Mifeet Avatar answered Sep 28 '22 06:09

Mifeet