Последствия и порядок объявления - PullRequest
6 голосов
/ 07 марта 2012

Вот упрощение того, с чем я столкнулся.Это компилирует:

trait A { implicit val x = 1 }
trait B extends A { val y = implicitly[Int] }

Хотя это не (не удалось найти неявное значение):

trait B extends A { val y = implicitly[Int] }
trait A { implicit val x = 1 }

Я попытался прояснить свои намерения, указав собственный тип: trait A { this: B => ... }, но безрезультатно.

Как мне справиться с такого рода зависимостями, не беспокоясь о том, как выложен мой код?

1 Ответ

11 голосов
/ 07 марта 2012

Вам необходимо объявить тип явно, по крайней мере, для последнего

trait B extends A { val y = implicitly[Int] }
trait A { implicit val x : Int = 1 }

Правила неявной видимости различаются независимо от того, объявлен ли ее тип явно или нет. Если это не так, неявное доступно (как неявное) только после точки объявления.

Причина в том, что вывод типа может стать слишком сложным, если тип не был объявлен (как в рекурсивной процедуре). Во многих случаях вывод будет легким (как в вашем коде), но спецификация должна быть четкой.

...