Scala中匹配String和Int之间的区别

时间:2011-02-28 06:40:51

标签: scala scala-2.8

考虑以下两个代码片段:

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,而f1String?我希望两者都返回Anyf2返回Int

1 个答案:

答案 0 :(得分:12)

如果方法返回不同的类型,则类型推断会选择最低的公共超类型。

您的函数f1会返回Stringnull,其常见超类型为String,因为String的值为null。 String是AnyRef的子类,AnyRef可以有null个值。

您的函数f2会返回IntAnyVal的子类)或null,其常见的超类型为AnyInt不能是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 btrue

如果()b,则

false

因此返回的类型为IntUnit。常见的超类型是AnyVal