在我自己的代码和大量邮件列表帖子中,我注意到由于 Nothing 被推断为其他两种类型的最小上限而造成混乱。
答案对你来说可能是显而易见的*,但我很懒,所以我问你*:
在什么条件下以这种方式推断Nothing是最理想的结果?
在这些情况下让编译器抛出错误或警告(除非被某种注释覆盖)是否有意义?
* 复数
Nothing 是一切事物的子类型,因此在某种意义上它是 Any 的对应部分,Any 是一切事物的超类型。没有什么是不能被实例化的,你永远不会拥有一个 Nothing 对象。 (我知道)有两种情况实际上没有任何用处:
object Nil extends List[Nothing]
,并且可以使用它来启动您喜欢的任何 List。对于你的第二个问题:是的,这很有用。我猜想已经有一个编译器开关可以打开这些警告,但我不确定。
不可能将
Nothing
推断为两种类型的最小上限,除非这两种类型也都是 Nothing
。当你推断两种类型的最小上限,并且这两种类型没有任何共同点时,你会得到 Any
(在大多数情况下,你会得到 AnyRef
,因为你只会得到 Any
当涉及像 Int
或 Long
这样的值类型时。)