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
。 任何指示都会有帮助。为什么Int,Double和Nothing的常见超级类型是AnyVal
'双'不是'超'的超类型 - 它们之间最具体的常见超类型是'AnyVal'。 – Lee
@这是真的,但是'Int'通常隐式转换为'Double'。在这种情况下,存在第三个“case”,它将抛出类型推断。 – Dima
@迪玛,谢谢你的帮助!我仍然想知道为什么'throws'子句停止隐式将'Int'转换为'Double'? – davidyoulanda