Scala 中匹配 String 和 Int 的区别

发布于 2024-10-19 06:53:00 字数 397 浏览 1 评论 0原文

考虑以下两个代码片段:

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 > ?我期望两者都返回 Anyf2 返回 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落在眉间の轻吻 2024-10-26 06:53:00

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

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

您的函数 f2 返回 IntAnyVal 的子类)或 null,其常见超类型是 AnyInt 不能为 null

请参阅 http://docs.scala-lang.org/tutorials/tour /unified-types.html 用于 Scala 的类层次结构。

另一个示例:

scala> def f3(b: Boolean) = if (b) 42
f: (b: Boolean)AnyVal

f3 返回

42 is b is true

() if b > 是

所以它返回的类型是IntUnit。常见的超类型是 AnyVal

The type inference chooses the lowest common supertype if a method returns different types.

Your function f1 returns a String or null, which common supertype is String because a String can have the value null. String is a subclass of AnyRef and AnyRefs can have null values.

Your function f2 return an Int (subclass of AnyVal) or null, which common supertype is Any. Int cannot be null.

See http://docs.scala-lang.org/tutorials/tour/unified-types.html for Scala´s class hierarchy.

Another example:

scala> def f3(b: Boolean) = if (b) 42
f: (b: Boolean)AnyVal

f3 returns

either 42 is b is true

or () if b is false.

So the types it returns are Int and Unit. The common supertype is AnyVal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文