对Scala中Any
和AnyRef
类型之间的区别感到好奇。
为什么int属于AnyVal
但字符串属于AnyRef
?
例如:
val a: AnyVal = 3
val b: AnyRef = "1"
答案 0 :(得分:1)
所有 Scala原语,如Int,Boolean等扩展AnyVal
接口
所有 Java原语或更好地说java.lang
库中的java对象扩展AnyRef
接口
有关详细信息,请阅读unified types,其中包含以下内容
AnyVal表示值类型。有九种预定义的值类型,它们是不可为空的:Double,Float,Long,Int,Short,Byte,Char,Unit和Boolean。单位是一种不带有意义信息的价值类型。只有一个Unit的实例可以像字面上那样声明:()。所有函数都必须返回一些东西,所以有时候Unit是一个有用的返回类型。
AnyRef表示引用类型。所有非值类型都定义为引用类型。 Scala中的每个用户定义类型都是AnyRef的子类型。如果在Java运行时环境的上下文中使用Scala,则AnyRef对应于java.lang.Object
在您的示例中val b: AnyRef = "1"
b
不可变变量被视为 java.lang.Object dataType 。
答案 1 :(得分:-1)
任何类型都是超类型。 Any有两个直接子类:AnyVal和AnyRef。
AnyVal表示值类型。有九种预定义的值类型,它们是不可为空的:Double,Float,Long,Int,Short,Byte,Char,Unit和Boolean。
AnyRef表示引用类型。所有非值类型都定义为引用类型。 Scala中的每个用户定义类型都是AnyRef的子类型。 scala中的字符串等于java.lang.String,是AnyRef的子类型。