Круговые определения не являются проблемой в этом случае, так как тип возвращаемого значения не является круговым, и реализация может быть решена за второй проход после того, как типы разрешены.
Например - и обратите внимание, что я оборачиваю все в объект, чтобы REPL рассмотрел все сразу:
object Example {
abstract class E {
def a: Int
def e: E = new AE(2)
}
class AE(val a: Int) extends E { }
}
и это работает как ожидалось:
scala> val ae = new Example.AE(0)
ae: Example.AE = Example$AE@57240e
scala> ae.a
res1: Int = 0
scala> ae.e.a
res2: Int = 2
Я предполагаю, что пока вы набираете его, вы пытаетесь заставить REPL принять только часть кругового определения, или вы пропускаете что-то, что позволяет округлости разрешаться в типах (например, если вы введете возвращаемое значение как AbstractElement
, а не Element
, это может сбить с толку!).
В любом случае, код «как есть» мне подходит.