scala隐含完成自己?

sth*_*elo 5 null scala implicit

我使用那种线来测试我的暗示,使其隐含于复制粘贴事故.我花了很长时间才弄清楚,为什么这个编译尽管我不期望它编译:

> console
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
... skipped some comment lines ...

scala> case object Foo
defined object Foo

scala> object Bar { implicit val f: Foo.type = implicitly[Foo.type] }
defined object Bar

scala> val x = Bar.f
x: Foo.type = null

scala> 
Run Code Online (Sandbox Code Playgroud)

我希望Bar编译失败,因为没有类型的隐式val Foo.type(case对象未声明为隐式).

对我来说,看起来编译器使用f自己的声明(左侧)来完成其实现(右侧).

这真的是预期的行为吗?在运行时,这会导致null值出现意外行为(对我来说主要是NPE).

Som*_*yya 3

发生这种情况是因为f被声明为implicit. 因此,在某种程度上, 的 右侧implicit val f: Foo.type = implicitly[Foo.type]解析为隐式 valf本身!

如果从该行删除 ,implicit编译将会失败。我想知道的是你为什么要使用这样的线。

这对我来说绝对是一个问题。不过,去年似乎已经有人记下了。

高级请求

  • 如果它是一个错误,那么它就在规范中,而不是代码中。val 定义属于隐式的外部范围,因此它作为搜索的候选者是有效的。常见的解决方法是不注释目标值,“implicit val f =implicitly[Foo.type]”会起作用,因为编译器失败,因为编译器不知道“f”将是所需的类型。 (3认同)