scala隐式完成自己?
scala implicit completing itself?
我用那种行来测试我的隐含,使它因复制粘贴事故而隐含。我花了很长时间才弄明白,尽管我不希望它编译,但为什么它会编译:
> 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)。
这是因为 f
被声明为 implicit
。所以在某种程度上 implicit val f: Foo.type = implicitly[Foo.type]
的右侧解析为隐式 val f
本身 !
如果从该行中删除 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)。
这是因为 f
被声明为 implicit
。所以在某种程度上 implicit val f: Foo.type = implicitly[Foo.type]
的右侧解析为隐式 val f
本身 !
如果从该行中删除 implicit
,编译将失败。
我想知道的是你为什么要使用这样一条线。
这对我来说绝对是个问题。不过好像去年就有人记过笔记了。