考虑以下两个代码片段:
scala> def f1(x:Any) = x match { case i:String => i; case _ => null }
f1: (x: Any)String
scala> def f2(x:Any) = x match { case i:Int => i; case _ => null }
f2: (x: Any)Any
为什么f2
的返回类型为Any
,而f1
为String
?我希望两者都返回Any
或f2
返回Int
。
答案 0 :(得分:12)
如果方法返回不同的类型,则类型推断会选择最低的公共超类型。
您的函数f1
会返回String
或null
,其常见超类型为String
,因为String
的值为null
。 String是AnyRef
的子类,AnyRef
可以有null
个值。
您的函数f2
会返回Int
(AnyVal
的子类)或null
,其常见的超类型为Any
。 Int
不能是null
。
有关Scala的类层次结构,请参阅http://docs.scala-lang.org/tutorials/tour/unified-types.html。
另一个例子:
scala> def f3(b: Boolean) = if (b) 42
f: (b: Boolean)AnyVal
f3
返回
42 b
是true
()
为b
,则或false
。
因此返回的类型为Int
和Unit
。常见的超类型是AnyVal
。