本文主要是介绍Scala之旅-统一类型(UNIFIED TYPES),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在 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
的替代方法。
这篇关于Scala之旅-统一类型(UNIFIED TYPES)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!