在什么条件推断下什么都不可取?

时间:2010-07-21 20:25:30

标签: scala type-inference nothing

在我自己的代码中,以及在众多邮件列表帖子中,我注意到混乱,因为没有任何东西被推断为其他两种类型的最小上限。

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

  • 在什么条件下推断这一点最好的结果?

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

*多个

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

除非这两种类型同时都是Nothing,否则无法将Nothing推断为两种类型的最小上限。当你推断出两种类型的最小上限,并且这两种类型没有任何共同点时,你会得到Any(在大多数情况下,你会得到AnyRef,因为你会仅在涉及AnyInt等值类型时才会获得Long。)