scala:Any和AnyRef之间的区别是什么?

时间:2018-03-21 09:13:39

标签: scala

对Scala中AnyAnyRef类型之间的区别感到好奇。 为什么int属于AnyVal但字符串属于AnyRef

例如:

val a: AnyVal = 3
val b: AnyRef = "1"

2 个答案:

答案 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的子类型。

structure of scala.Any