【发布时间】:2015-01-05 12:15:53
【问题描述】:
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。
任何指向都会有所帮助。
【问题讨论】:
-
Double不是Int的超类型——它们之间最具体的常见超类型是AnyVal。 -
@Lee 这是真的,但
Int通常会隐式转换为Double。在这种情况下,第三个case的存在会引发类型推断。 -
@Dima,感谢您的帮助!我仍然想知道为什么
throws子句会停止将Int隐式转换为Double?