Ответ 1
Чтобы вывести тип y
, компилятор должен сначала определить тип значения в правой части назначения. Оценивая тип правой руки, он сталкивается с ссылкой на переменную y
, которая (в данный момент) еще неизвестного типа. Таким образом, компилятор определяет цикл "тип y
зависит от типа y
" и не работает.
Во втором примере эта ситуация не возникает, потому что при оценке типа new A(new B(y))
он уже знает тип y
и преуспевает.
Изменить: когда тип рекурсивно используемой переменной y
должен содержать смешанный признак, он может быть объявлен следующим образом:
val y : A with Mixin = new A(new B(y)) with Mixin