6

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

答案对你来说可能很明显*,但我很懒,所以我问你*:

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

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

* 复数

4

2 回答 2

4

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

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

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

于 2010-07-21T21:36:41.840 回答
2

不可能推断Nothing为两种类型的最小上限,除非这两种类型也都是Nothing. 当您推断出两种类型的最小上限,并且这两种类型没有任何共同点时,您会得到Any(在大多数这种情况下,您会得到AnyRef,因为您只会在涉及or之Any类的值类型时得到.)IntLong

于 2010-07-22T03:43:52.133 回答