什么条件下可以推断出Nothingdesirable?

问题描述 投票:0回答:2

在我自己的代码和大量邮件列表帖子中,我注意到由于 Nothing 被推断为其他两种类型的最小上限而造成混乱。

答案对你来说可能是显而易见的*,但我很懒,所以我问你*:

  • 在什么条件下以这种方式推断Nothing是最理想的结果?

  • 在这些情况下让编译器抛出错误或警告(除非被某种注释覆盖)是否有意义?

* 复数

scala type-inference
2个回答
4
投票

Nothing 是一切事物的子类型,因此在某种意义上它是 Any 的对应部分,Any 是一切事物的超类型。没有什么是不能被实例化的,你永远不会拥有一个 Nothing 对象。 (我知道)有两种情况实际上没有任何用处:

  • 永远不会返回的函数(与不返回有用值的函数相反,后者会使用 Unit 来代替),这种情况发生在无限循环、无限阻塞、始终抛出异常或退出应用程序时
  • 作为指定空容器类型的一种方式,例如无或无。在 Java 中,如果没有强制转换或其他技巧,就不能为通用不可变列表使用单个 Nil 对象:如果要创建日期列表,即使是空元素也需要具有正确的类型,该类型必须是日期。作为日期和例如Integer 在 Java 中不共享公共子类型,如果没有技巧,你就无法创建这样的 Nil 实例,尽管事实上你的 Nil 甚至不包含任何值。现在 Scala 为所有对象提供了这种通用子类型,因此您可以将 Nil 定义为
    object Nil extends List[Nothing]
    ,并且可以使用它来启动您喜欢的任何 List。

对于你的第二个问题:是的,这很有用。我猜想已经有一个编译器开关可以打开这些警告,但我不确定。


2
投票

不可能将

Nothing
推断为两种类型的最小上限,除非这两种类型也都是
Nothing
。当你推断两种类型的最小上限,并且这两种类型没有任何共同点时,你会得到
Any
(在大多数情况下,你会得到
AnyRef
,因为你只会得到
Any 
当涉及像
Int
Long
这样的值类型时。)

© www.soinside.com 2019 - 2024. All rights reserved.