Scala 类型层次结构
source link: https://mp.weixin.qq.com/s/6f7HrBuDJXljHe7SywAYhg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
java的除了原始类型的所有类都有一个默认的父类Object,那么scala的统一父类是什么呢?这个是有人在群里问浪尖的一个问题,今天浪尖就给大家讲解一下Scala类型层次结构
在Scala中,所有的值都有类型,包括数值和函数。下图阐述了类型层次结构的一个子集。
1. Scala类型层次结构
Any
是所有类型的超类型,也称为顶级类 型。它定义了一些通用的方法如 equals
、 hashCode
和 toString
。 Any
有两个直接子类: AnyVal
和 AnyRef
。
AnyVal
代表值类型。有9个预定义的非空的值类型分别是: Double
、 Float
、 Long
、 Int
、 Short
、 Byte
、 Char
、 Unit
和 Boolean
。 Unit
是不带任何意义的值类型,它仅有一个实例可以像这样声明: ()
。所有的函数必须有返回,所以说有时候 Unit
也是有用的返回类型。
AnyRef
代表引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户自定义的类型都是 AnyRef
的子类型。如果Scala被应用在Java的运行环境中, AnyRef
相当于 java.lang.Object
。
这里有一个例子,说明了字符串、整型、布尔值和函数都是对象,这一点和其他对象一样:
<span>val list: List[Any] = List(</span>
<span> "a string",</span>
<span> 732,</span>
<span> 'c',</span>
<span> true,</span>
<span> () => "an anonymous function returning a string"</span>
<span>)</span>
<span><br /></span>
<span>list.foreach(element => println(element))</span>
这里定义了一个类型 List<Any>
的变量 list
。这个列表里由多种类型进行初始化,但是它们都是 scala.Any
的实例,所以可以把它们加入到列表中。
下面是程序的输出:
a string732ctrue<function>
2. 类型转换
值类型可以按照下面的方向进行转换:
例如:
<span>val x: Long = 987654321</span>
<span>val y: Float = x</span>
<span><br /></span>
<span>val face: Char = '☺'</span>
<span>val number: Int = face</span>
转换是单向,下面这样写将不会通过编译。
<span>val x: Long = 987654321</span>
<span>val y: Float = x</span>
<span>val z: Long = y</span>
你可以将一个类型转换为子类型,这点将在后面的文章介绍。
Nothing和Null
Nothing
是所有类型的子类型,也称为底部类型。没有一个值是 Nothing
类型的。它的用途之一是给出非正常终止的信号,如抛出异常、程序退出或者一个无限循环(可以理解为它是一个不对值进行定义的表达式的类型,或者是一个不能正常返回的方法)。
Null
是所有引用类型的子类型(即 AnyRef
的任意子类型)。它有一个单例值由关键字 null
所定义。 Null
主要是使得Scala满足和其他JVM语言的互操作性,但是几乎不应该在Scala代码中使用。我们将在后面的章节中介绍 null
的替代方案。
推荐阅读:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK