Scala 中匹配 String 和 Int 的区别
考虑以下两个代码片段:
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
。
Consider the following two fragments of code:
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
Why is f2
's return type Any
, while f1
's is String
? I was expecting either both to return Any
or f2
to return Int
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果方法返回不同的类型,类型推断会选择最低的公共超类型。
您的函数
f1
返回一个String
或null
,其常见超类型是String
,因为String
code> 可以具有值null
。 String 是AnyRef
的子类,并且AnyRef
可以具有null
值。您的函数
f2
返回Int
(AnyVal
的子类)或null
,其常见超类型是Any
。Int
不能为null
。请参阅 http://docs.scala-lang.org/tutorials/tour /unified-types.html 用于 Scala 的类层次结构。
另一个示例:
f3
返回42 is
b
istrue
或
()
ifb
> 是假
。所以它返回的类型是
Int
和Unit
。常见的超类型是AnyVal
。The type inference chooses the lowest common supertype if a method returns different types.
Your function
f1
returns aString
ornull
, which common supertype isString
because aString
can have the valuenull
. String is a subclass ofAnyRef
andAnyRef
s can havenull
values.Your function
f2
return anInt
(subclass ofAnyVal
) ornull
, which common supertype isAny
.Int
cannot benull
.See http://docs.scala-lang.org/tutorials/tour/unified-types.html for Scala´s class hierarchy.
Another example:
f3
returnseither 42 is
b
istrue
or
()
ifb
isfalse
.So the types it returns are
Int
andUnit
. The common supertype isAnyVal
.