为什么 Int、Double 和 Nothing 的通用超类型是 AnyVal

Why Int, Double and Nothing 's common super type is AnyVal

scala> def b(x:Int) = { x match { case 1 => 1; case 2 => 3.5; case k => throw new Exception("Nothing")}} 
b: (x: Int)AnyVal
scala> def c(x: Int) = if (x == 1) 1 else if (x == 2) 3.5 else throw new Exception("Nothing")
c: (x: Int)Double

这是我从 REPL 得到的。为什么 scala 编译器将函数 b 的 return 类型视为 AnyVal。按照我的想法,应该是Double。 任何指点都会有所帮助。

Nothingevery 类型的子类型(参见 Scaladoc)。这是允许

等表达式所必需的
val x : Int = ???

IntDouble 最不常见的超类型是 AnyValNothing,是任何东西的子类型(包括 AnyVal),因此不会改变推断的类型。

如果您需要以这种方式对待它,您可以将其声明为 def b(x:Int): Double。 没有它,编译器会被 throws 子句弄糊涂并错误地推断出类型。类型推断并不完美,有时你必须帮助魔术 :)