Рекурсивное значение xxx нуждается в типе в Scala

Я смущен тем, почему Scala жалуется на этот код. У меня есть два класса, которые зависят друг от друга. Когда я пытаюсь создать новый экземпляр 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

Почему компилятор не знает тип y, когда объявлен как new A

Ответ 1

Чтобы вывести тип y, компилятор должен сначала определить тип значения в правой части назначения. Оценивая тип правой руки, он сталкивается с ссылкой на переменную y, которая (в данный момент) еще неизвестного типа. Таким образом, компилятор определяет цикл "тип y зависит от типа y" и не работает.

Во втором примере эта ситуация не возникает, потому что при оценке типа new A(new B(y)) он уже знает тип y и преуспевает.

Изменить: когда тип рекурсивно используемой переменной y должен содержать смешанный признак, он может быть объявлен следующим образом:

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

Ответ 2

Вы можете конкретно указать тип y и скомпилировать его:

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