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
。
任何指点都会有所帮助。
答案 0 :(得分:4)
Nothing
是每个类型的子类型(请参阅Scaladoc)。这对于允许诸如
val x : Int = ???
Int
和Double
的最不常见的超类型是AnyVal
。 Nothing
,是任何事物的子类型(包括AnyVal
),因此不会更改推断类型。
答案 1 :(得分:-1)
如果需要以此方式对待,您可以将其声明为def b(x:Int): Double
。
没有它,编译器会被throws
子句搞糊涂,并错误地推断出类型。类型推断并不完美,有时你必须帮助神奇:)