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).
发生这种情况是因为f被声明为implicit. 因此,在某种程度上, 的 右侧implicit val f: Foo.type = implicitly[Foo.type]解析为隐式 valf本身!
如果从该行删除 ,implicit编译将会失败。我想知道的是你为什么要使用这样的线。
这对我来说绝对是一个问题。不过,去年似乎已经有人记下了。
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |