为什么Int,Double和Nothing的常见超类型是AnyVal

时间:2015-01-05 12:15:54

标签: scala types inference

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'返回类型为AnyVal。我认为应该是Double。 任何指点都会有所帮助。

2 个答案:

答案 0 :(得分:4)

Nothing每个类型的子类型(请参阅Scaladoc)。这对于允许诸如

之类的表达式是必要的
val x : Int = ???

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

答案 1 :(得分:-1)

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