为什么 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
。
任何指点都会有所帮助。
Nothing
是 every 类型的子类型(参见 Scaladoc)。这是允许
等表达式所必需的
val x : Int = ???
Int
和 Double
最不常见的超类型是 AnyVal
。 Nothing
,是任何东西的子类型(包括 AnyVal
),因此不会改变推断的类型。
如果您需要以这种方式对待它,您可以将其声明为 def b(x:Int): Double
。
没有它,编译器会被 throws
子句弄糊涂并错误地推断出类型。类型推断并不完美,有时你必须帮助魔术 :)
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
。
任何指点都会有所帮助。
Nothing
是 every 类型的子类型(参见 Scaladoc)。这是允许
val x : Int = ???
Int
和 Double
最不常见的超类型是 AnyVal
。 Nothing
,是任何东西的子类型(包括 AnyVal
),因此不会改变推断的类型。
如果您需要以这种方式对待它,您可以将其声明为 def b(x:Int): Double
。
没有它,编译器会被 throws
子句弄糊涂并错误地推断出类型。类型推断并不完美,有时你必须帮助魔术 :)