【问题标题】:scala implicit completing itself?scala隐式完成自己?
【发布时间】:2016-08-29 14:03:43
【问题描述】:

我使用这种行来测试我的隐含,使其因复制粘贴意外而隐含。我花了很长时间才弄清楚为什么尽管我没想到它会编译它却能编译:

> 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(案例对象未声明为隐式)。

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

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

【问题讨论】:

    标签: scala null implicit


    【解决方案1】:

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

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

    这对我来说绝对是个问题。不过好像有人去年已经记下了。

    Enhancement Request

    【讨论】:

    • 上述问题被标记为“增强”。我会认为这是一个错误。有没有机会提高它的重要性?
    • 我同意这是个问题。我认为您可以继续向他们记录问题。或者,可以对该 enhancement 请求添加评论。我也会这样做。
    • 如果它是一个错误,它在规范中,而不是代码中。 val 定义属于隐式的外部范围,因此它作为搜索的候选者是有效的。常见的解决方法是不注释目标值,implicit val f = implicitly[Foo.type] 会起作用,因为编译失败,因为编译器不知道 f 将是所需的类型。
    • 好点。向上。但我还是觉得这个需要处理清楚。
    • 在一种情况下,我发现从 f 中删除显式类型并让它从右侧推断会产生编译器错误,而不是没有编译器错误。
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2015-05-07
    • 2020-12-08
    • 2013-08-16
    • 2014-07-20
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多