0%

scala数据类型

Scala 数据类型:面向对象的类型系统

Scala 作为纯粹的面向对象语言,其数据类型系统与 Java 有显著差异 ——所有类型都是对象,不存在 Java 中的 “基本数据类型” 与 “引用类型” 的严格区分。Scala 类型系统以 Any 为根,分为 AnyVal(值类型)和 AnyRef(引用类型)两大分支,形成层次清晰的类型体系。

类型体系概览

Scala 类型系统的核心层次结构如下:

  • 根类型:Any(所有类型的父类)
    • 值类型AnyVal(包括数值类型、布尔型等)
    • 引用类型AnyRef(包括类、特质、数组等,对应 Java 的 Object
  • 特殊类型Null(所有 AnyRef 的子类)、Nothing(所有类型的子类)

AnyVal:值类型

AnyVal 代表值类型,对应 Java 中的 “基本数据类型”,但在 Scala 中仍是对象,拥有方法和属性。常见的 AnyVal 类型包括:

类型 描述 示例
Int 32 位整数 val a: Int = 10
Long 64 位整数(后缀 L) val b: Long = 100L
Float 32 位浮点数(后缀 f) val c: Float = 3.14f
Double 64 位浮点数(默认小数类型) val d: Double = 3.14159
Boolean 布尔值(true/false) val e: Boolean = true
Char 16 位字符(单引号包裹) val f: Char = 'A'
Byte 8 位整数 val g: Byte = 0x10
Short 16 位整数 val h: Short = 32767
Unit 无返回值标记(类似 void) def hello(): Unit = println("hi")

值类型的特性

  1. 默认类型

    • 整数默认是 Int(超出范围自动推断为 Long
    • 小数默认是 Double(需显式加 f 声明 Float
    1
    2
    3
    4
    val num1 = 100      // 推断为Int
    val num2 = 10000000000L // 显式声明Long
    val num3 = 3.14 // 推断为Double
    val num4 = 3.14f // 显式声明Float
  2. 自动类型转换

    • 低精度类型可自动转换为高精度类型(类似 Java 的 “拓宽转换”)
    • 转换方向:Byte → Short → Int → Long → Float → Double
    1
    2
    3
    val i: Int = 100
    val l: Long = i // 合法:Int自动转为Long
    val d: Double = l // 合法:Long自动转为Double
  3. 强制类型转换

    • 高精度转低精度需显式调用转换方法(无 Java 的 (类型) 语法)
    1
    2
    3
    4
    5
    val d: Double = 2.9
    val i: Int = d.toInt // 强制转换为Int(结果为2,截断小数)

    val c: Char = 'A'
    val b: Byte = c.toByte // 字符转Byte(获取ASCII码)
  4. Unit 类型

    • 表示 “无返回值”,类似 Java 的 void,但 Unit 是真正的类型
    • 唯一实例是 ()(空括号)
    1
    2
    3
    4
    def printHello(): Unit = {
    println("Hello")
    }
    val result: Unit = printHello() // result的值为()

AnyRef:引用类型

AnyRef 对应 Java 的 Object 类型,包括所有自定义类、数组、字符串等引用类型。Scala 中 StringArray 及用户定义的类都属于 AnyRef

1
2
3
4
val str: String = "Scala"  // String是AnyRef的子类
val arr: Array[Int] = Array(1, 2, 3) // 数组是AnyRef
class Person // 自定义类默认继承AnyRef
val p: Person = new Person()

Null 类型

  • Null 是所有 AnyRef 的子类,唯一实例是 null
  • 只能赋值给 AnyRef 类型变量(不能赋值给 AnyVal
1
2
val obj: String = null  // 合法:String是AnyRef
// val num: Int = null // 错误:Int是AnyVal,不接受null

Nothing:所有类型的子类

Nothing 是 Scala 类型系统的底部类型,是所有类型的子类,但没有实例。它主要用于:

  1. 表示异常(异常的返回类型是 Nothing
  2. 作为永不返回的方法的返回类型
1
2
3
4
5
6
def error(message: String): Nothing = {
throw new RuntimeException(message) // 抛出异常,永不返回
}

val x: Int = error("出错了") // 合法:Nothing是Int的子类
val y: String = error("出错了") // 合法:Nothing是String的子类

Scala 与 Java 类型对比

特性 Scala Java
类型本质 所有类型都是对象(Any 子类) 分基本类型(如 int)和引用类型
根类型 Any Object(仅引用类型)
无返回值标记 Unit(有实例 () void(不是类型)
空值类型 Null(仅 AnyRef 子类) null(可赋值给任何引用类型)
底部类型 Nothing(所有类型的子类) 无对应类型

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10