Scala之旅-统一类型(UNIFIED TYPES)

本文介绍了Scala中的类型层次结构,包括顶层类型Any及其子类型AnyVal和AnyRef,详细解释了值类型和引用类型的特点及应用,并展示了如何进行类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Scala 中,所以的值都有类型,包括数值和函数。下图说明了类型层次结构的子集。
这里写图片描述
Scala类型层次结构

Any 是所有类型的父类型,也叫顶层类型。它里面定义了几个确定的方法,例如equalshashcodetoStringAny 有两个直接的子类 AnyValAnyRef
AnyVal 代表值类型,有9种预定义的值类型并且它们都不能为空:Double,Float,Long,Int,Short,Byte,Unit,CharBooleanUnit是不带有意义信息的值类型。确切的说,Unit 实例可以像这样被声明 :()。因为所有的函数都必须返回一些东西,所以有时 Unit 会是很有用的返回类型。
AnyRef 代表引用类型。全部的非值类型都被定义为引用类型。在Scala中用户定义的每个类型都是 AnyRef 的子类型。如果 Scala 运行在Java运行环境中,AnyRef 相当于 java.lang.Object
下面的例子演示了字符串,整数,字符,布尔值和函数,他们和其他对象一样都是对象。

val list: List[Any] = List(
  "a string",
  732,  // 整数
  'c',  // 字符
  true, // 布尔值
  () => "一个返回字符串的匿名函数"
)
list.foreach(element => println(element))

这里写图片描述
上面代码中定义了一个 List[Any] 类型的list变量,list 被不同类型的元素初始化,但这些元素都是Scala.Any的实例。所以可以将它们添加进 list 中。
可以从上图中看到输出结果中包含了不同的元素类型。

类型转换

值类型可以按照下图箭头指示的方式进行转换。如Char可以转为Int
这里写图片描述
例如:

val x: Long = 987654321
val y: Float = x  // 9.8765434E8 (注意在这个例子中强制转换会导致y丢失精度)
val face: Char = '☺'
val number: Int = face  // 9786

这里写图片描述
强制转换是单向的,以下的例子不会通过编译

val x: Long = 987654321
val y: Float = x  // 9.8765434E8
val z: Long = y  // 不符合规则

这里写图片描述
接下来的章节将介绍如何将引用类型转换为子类型。

Nothing 和 Null

Nothing 是所有类型的子类型,也叫做底部类型。没有 Nothing 类型的值。一个常见的用法是用于发出非终止信号,例如抛出异常、程序退出或者一个死循环(无法计算出值的表达式或是没有正常返回的方法)。
Null 是所有引用类型的子类型(也就是说是AnyRef 的任何子类型)。它是由关键字 null 定义的单个值。null 主要是为了和其它JVM语言的交互而提供的,并且应该永远不要在Scala代码中使用它,我们将在后面探索 null 的替代方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值