加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala隐含完成自己?

发布时间:2020-12-16 18:36:50 所属栏目:安全 来源:网络整理
导读:我使用那种线来测试我的暗示,使其隐含于复制粘贴事故.我花了很长时间才弄清楚,为什么这个编译尽管我不期望它编译: 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)
我使用那种线来测试我的暗示,使其隐含于复制粘贴事故.我花了很长时间才弄清楚,为什么这个编译尽管我不期望它编译:

> 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自己的声明(左侧)来完成其实现(右侧).

这真的是预期的行为吗?在运行时,这会导致具有空值的意外行为(对我来说大多数是NPE).

解决方法

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

如果从该行中删除隐式,则编译将失败.
我想知道的是你为什么要使用这样的线路.

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

Enhancement Request

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读