[译]Scala统一的类型
在Scala中,所有值都有类型,包括数值和函数。下图说明了类的层次结构。
文章图片
image.png Scala类型的层次结构
Any
是所有类的父类,也称为top类型。它定义了一些通用的方法,如equals
,hashCode
和toString
。Any
的两个直接子类是AnyVal
和 AnyRef
。
AnyVal
代表值类型。有9中预定义的值类型,他们都是非空的:Double
,Float
,Long
,Int
,Short
,Byte
,Char
,Unit
, 和Boolean
。Unit
是一种没有任何意义信息的值类型。可以使用()
声明Unit
的实例。所有函数都必须有返回值,所以有时候Unit
是有用的返回类型。
AnyRef
代表引用类型。所有非值类都定义为引用类型。在Scala中,每个用户定义的类都是AnyRef
的子类型。如果在Java运行时环境的上下文中使用Scala,则AnyRef
对应于java.lang.Object
。
这里有个示例说明字符串,整型,字符,布尔值以及函数都是对象,就像其它对象一样:
val list: List[Any] = List(
"a string",
732,// an integer
'c',// a character
true, // a boolean value
() => "an anonymous function returning a string"
)list.foreach(element => println(element))
【[译]Scala统一的类型】程序中定义了一个
List[Any]
类型的变量list
。这个列表用多种类型的元素初始化,但是都是scala.Any
的实例,所以可以将它们添加到列表中。下面是程序的输出:
a string
732
c
true
类型转换 值类型可以按照如下方式进行转换:
文章图片
image.png
例如:
val x: Long = 987654321
val y: Float = x// 9.8765434E8 (note that some precision is lost in this case)val face: Char = '?'
val number: Int = face// 9786
转换是单向的。下面的转换不能通过编译:
val x: Long = 987654321
val y: Float = x// 9.8765434E8
val z: Long = y// Does not conform
你也将引用类型转换为其子类型。之后会进行详细说明。
Nothing和Null
Nothing
是所有类型的子类型,也叫做bottom类型。没有值的类型是Nothing
。通常用于标记未终止,如抛出异常,程序退出或者无限循环(即它时一种没有值的类型,或者不正常返回的方法)Null
是所有引用类型(即AnyRef的任何子类型)的子类型。它有个单一值,由关键字null
标记。Null
用于与其它JVM语言进行交互,不应该在Scala代码中使用它。之后会讨论替代它的方法。推荐阅读
- 【译】20个更有效地使用谷歌搜索的技巧
- 操作系统|[译]从内部了解现代浏览器(1)
- 克里希那穆提《生命书》新译(8月15日)(心与念的二元分裂)
- 2020|2020 CATTI英语一级笔译
- 故事|故事||三秒记忆 多少爱
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- cocosbcx白皮书解读(一)|cocosbcx白皮书解读(一)| 区块链如何统一开发者、发行商、用户之间的利益
- [译文]Domain|[译文]Domain Driven Design Reference(四)—— 柔性设计
- 《Unix网络编程》第一卷第三版|《Unix网络编程》第一卷第三版 源码编译
- maven使用tomcat7插件编译jsp出错