Scala:Any和AnyRef有什么区别?

4

我对Scala中的AnyAnyRef类型之间的区别很好奇。为什么int属于AnyVal,而string属于AnyRef

例如:

val a: AnyVal = 3
val b: AnyRef = "1"
2个回答

15

Any是所有类型的超类型。Any有两个直接子类:AnyVal和AnyRef。

AnyVal代表值类型。预定义了九种值类型,它们是非空的:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。

AnyRef代表引用类型。所有非值类型都被定义为引用类型。Scala中每个用户定义的类型都是AnyRef的子类型。Scala中的String等同于Java中的java.lang.String,是AnyRef的子类型。

scala.Any的结构


2
所有的Scala原始类型,比如Int、Boolean等都扩展了AnyVal接口。
而所有的Java原始类型,或者更好地说是在java.lang库中的Java对象都扩展了AnyRef接口。
要获取更多信息,请阅读统一类型,其中写道:
AnyVal表示值类型。有九种预定义的值类型,它们是不可为空的:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一个不携带有意义信息的值类型。有一个确切的Unit实例,可以这样声明:()。所有函数必须返回某些内容,所以有时Unit是一个有用的返回类型。
AnyRef表示引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户定义的类型都是AnyRef的子类型。如果在Java运行时环境中使用Scala,则AnyRef对应于java.lang.Object。
在您的示例中,val b: AnyRef = "1",变量b是不可变的,并被视为java.lang.Object数据类型

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接