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

xiaoxiao2021-02-28  30

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

Any 是所有类型的父类型,也叫顶层类型。它里面定义了几个确定的方法,例如equals,hashcode和toString。Any 有两个直接的子类 AnyVal 和 AnyRef。 AnyVal 代表值类型,有9种预定义的值类型并且它们都不能为空:Double,Float,Long,Int,Short,Byte,Unit,Char和Boolean。Unit是不带有意义信息的值类型。确切的说,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 的替代方法。

转载请注明原文地址: https://www.6miu.com/read-2627034.html

最新回复(0)