【发布时间】:2015-10-13 14:10:26
【问题描述】:
为什么scala在这里找不到隐式?
class A
class Foo {
lazy val x = implicitly[A]
implicit lazy val a = new A
}
错误:找不到参数 e 的隐式值:A
但这很好用:
class Foo {
lazy val x = implicitly[A]
implicit lazy val a: A = new A // note explicit result type
}
定义类 Foo
FWIW 对于这个应用程序,我坚持使用 Scala 2.10。此外,将lazy val 替换为def 似乎没有任何改变。
在我的实际应用程序中,我有一个文件,其中包含为各种域对象定义的一堆隐式,其中一些是相互依赖的。尝试以一种确保所有依赖项都位于其各自依赖项之前的方式来安排它们似乎是一场噩梦,因此我将它们全部标记为lazy。必须显式声明每个 val 的类型会使代码变得混乱,而且似乎没有必要。有什么办法吗?
【问题讨论】:
-
Scala2.11 也会发生这种情况。正如你所说,正确的顺序确实有效
implicit lazy val a = new A; lazy val x = implicitly[A]。这不应该是 Scala 中的一个错误吗? -
如果您将隐式调用移到隐式惰性 val 定义之后,则无需添加类型注释即可编译。