scala隐含完成自己?

时间:2016-05-04 08:39:29

标签: scala null 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> 

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

这对我来说绝对是一个问题。去年有人看起来已经注意到了。

Enhancement Request