Scala-数据类型-概述(Scala 3.x 类型层次结构)

news2025/1/21 22:06:04

Scala

在这里插入图片描述

Scala-数据类型

  • Scala
      • 1. `Any` — 顶级类型
      • 2. `Matchable` — 匹配类型
      • 3. `AnyVal` — 值类型的父类
      • 4. `AnyRef` — 引用类型的父类
      • 5. `Null` - 引用类型的子类型
        • Tips: 为什么 `null` 不推荐使用?
      • 6. `Nothing` - 底层类型 (Bottom Type)
      • 整理不易,对您有帮助的话,还请三连呀~🤣🤣🤣谢谢啦

在 Scala 中,所有的值都有类型。无论是数字、字符、布尔值,还是函数和对象,Scala 都为每个值分配了一个类型

在这里插入图片描述

Scala 的类型系统是强类型的,具有丰富的层次结构。结合了面向对象编程和函数式编程的特性,使得类型系统既强大又灵活。

1. Any — 顶级类型

AnyScala 中所有类型的超类型supertype),也叫做顶级类型。它是 Scala 类型系统的根类型,所有的类型(无论是值类型、引用类型,还是自定义类型)都直接或间接地继承自 Any
在这里插入图片描述
Any 类型定义了几个通用方法

  • equals:用于比较两个对象是否相等。
  • hashCode:用于计算对象的哈希值。
  • toString:用于返回对象的字符串表示。

Any 本身是一个比较通用的类型,但在模式匹配(pattern matching)中,不能直接匹配类型为 Any 的值,因为 Any 本身并不具备这种匹配能力。


2. Matchable — 匹配类型

MatchableAny 的子类型,标记了所有可以进行模式匹配的类型Scala 引入了 Matchable 类型是为了实现“参数化性”(parametricity)的概念。

参数化性意味着我们不能在类型为 Any 的值上进行模式匹配,只有那些是 Matchable 子类型的值才能进行模式匹配
在这里插入图片描述
简单来说,Matchable 类型限定了哪些类型可以参与模式匹配,比 Any 更加具体。Scala 通过引入 Matchable 来确保类型的安全性和一致性。


3. AnyVal — 值类型的父类

AnyVal 是 Scala 中所有值类型(value types)的父类,表示那些不可变的、直接存储值的类型。AnyVal 是不可为 null 的类型。
在这里插入图片描述
AnyVal 下的基本类型:

  • Int:32 位整数。

  • Long:64 位整数。

  • Float:单精度浮动点数。

  • Double:双精度浮动点数。

  • Short:16 位整数。

  • Byte:8 位整数。

  • Char:字符类型。

  • Boolean:布尔类型。

  • Unit类似于 Java 中的 void,表示没有有意义的返回值Unit 只有一个实例:(),表示“无”或“空”。

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
精度丢失不允许转换:

在这里插入图片描述
强制类型转换:
在这里插入图片描述
在这里插入图片描述

Tips:
所有这些值类型都是不可为空的,因此它们都属于 AnyVal,并且在内存中通常存储的是值本身。

val s: String = null  // 这是合法的,因为 String 是引用类型
val n: Int = null     // 编译错误,因为 Int 是值类型,不能为 null

在这里插入图片描述


4. AnyRef — 引用类型的父类

AnyRef 是 Scala 中所有引用类型(reference types)的父类,表示那些存储引用的类型(即指向对象的引用)。在 Scala 中,所有自定义类、集合类型以及从 Java 导入的类都属于 AnyRef 类型。
在这里插入图片描述
AnyRef 相当于 Java 中的 java.lang.Object,它是所有引用类型的基类。对于 Scala 用户来说,所有非值类型(包括类、接口、集合等)都继承自 AnyRef

eg:

  • String:字符串类型,表示不可变的字符序列。
  • List[T]:不可变的列表类型,表示一种线性序列。
  • Map[K, V]:不可变的映射类型,表示键值对集合。
val s: String = null  // 这是合法的,因为 String 是引用类型
val n: Int = null     // 编译错误,因为 Int 是值类型,不能为 null

在这里插入图片描述


5. Null - 引用类型的子类型

Null 是 Scala 类型系统中所有引用类型的子类型,表示一个可以引用空值的类型。所有继承自 AnyRef(即所有引用类型)的类型都可以被赋值为 null,这就是 Null 类型的作用。
在这里插入图片描述

  • 单一值Null 有且只有一个实例,就是 nullnull 在 Scala 中的作用与 Java 类似,表示一个空引用。

    • null 用来表示缺失的引用,即一个没有指向有效对象的引用。它通常用来表示对象的初始状态或错误状态。
    • 尽管 nullAnyRef 的子类型,但在 Scala 中不推荐广泛使用 null,因为会带来了空指针异常(NullPointerException)等问题。
  • 关于 Null 的特殊性

    • NullAnyRef 的子类型,但它并不是所有类型的子类型。例如,IntBoolean 等值类型不能被赋值为 null,它们属于 AnyVal 类型,不允许使用 null
val s: String = null  // 这是合法的,因为 String 是引用类型
val n: Int = null     // 编译错误,因为 Int 是值类型,不能为 null

在 Scala 2.x 中,null 被认为是不可避免的,但 Scala 3 引入了更多的功能,以减少 null 的使用,并鼓励更安全的替代方案,如 Option

Tips: 为什么 null 不推荐使用?

在 Scala 中,使用 null 被认为是一个不好的实践:

  • 空指针异常null 很容易导致空指针异常NullPointerException),尤其是在进行解引用时。
  • 不可空性Scala 提供了更安全的替代方案,例如 Option[T] 类型,它可以表示可能为空的值,同时避免了空指针异常的问题Option 有两个子类型:Some[T]None,它们使得空值成为显式的类型,而不是隐式的引用。

使用 null 来表示没有值的情况,通常使用 Option

val name: Option[String] = Some("Alice")  // Some 包装了一个非空值
val noName: Option[String] = None         // None 表示没有值

// 使用 Option 可以安全地处理空值
name match {
  case Some(value) => println(s"Hello, $value!")
  case None => println("No name provided")
}

6. Nothing - 底层类型 (Bottom Type)

Nothing 是 Scala 类型系统中的底层类型(bottom type),它是所有类型的子类型,也就是说,每个类型都可以被看作是 Nothing 的父类。但 Nothing 本身并没有值,它的主要用途是标识“没有返回值”的情况。
在这里插入图片描述

  • 没有值:没有任何表达式会返回 Nothing 类型的值。换句话说,Nothing 是一个空的类型,它没有实例。

  • 异常:当程序抛出异常时,返回类型为 Nothing。例如,throw new Exception("Something went wrong") 这个表达式会返回类型 Nothing,因为它表示程序在此点不再正常执行,直接跳出函数或方法。

  • 无限循环:类似地,一个无限循环如 while(true) {} 也会被视为返回 Nothing,因为它永远不会结束,也不会正常返回。

  • 非正常退出:任何不返回值的非正常退出(如程序终止)都会使用 Nothing 类型来标识。

def fail(msg: String): Nothing = {
  throw new Exception(msg)  // 函数返回 Nothing 类型,表示程序抛出异常并终止
}

val result: Int = fail("Error!")  // `fail` 函数可以赋值给类型为 `Int` 的变量,表示返回值是一个不可达的点
特性NothingNull
类型层次是所有类型的子类型 (底层类型)是所有引用类型(AnyRef)的子类型
是否有值没有任何值只有一个值:null
使用场景用于表示无值、异常或非正常退出用于表示引用类型的空值
适用类型可以作为任何类型的返回类型仅适用于引用类型(AnyRef
示例throw new Exception("Error")val s: String = null

整理不易,对您有帮助的话,还请三连呀~🤣🤣🤣谢谢啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式linux中红外接收基本方法分析

大家好,今天主要给大家分享一下,如何使用Linux系统中的红外接收驱动控制方法。 第一:Linux红外基本简介 红外遥控是我们常见的一种无线收发设备,具有抗干扰能力强,功耗低,成本低,易实现等优点。被很多电子设备特别是家用电器广泛采用,如电视遥控、空调遥控等。红外遥控…

AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows

在 Windows 平台上的实现,相对比较顺利,将一个窗口嵌入到另外一个窗口是比较容易的事情。 1. 创建窗口 这里有点需要注意: 父窗口的大小变化时,子窗口也要跟着变化,否则 webview 显示不出来。创建时窗口的大小先设置…

pgAdmin简单介绍

pgAdmin介绍 官网:https://www.pgadmin.org/ pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. pgAdmin may be used on Linux, Unix…

Linux笔记---调试工具GDB(gdb)

1. gdb的概念 GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。 gd…

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台,专为团队协作设计。它类似于 Slack,提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎,因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

2. Django中的URL调度器 (自定义路径转换器)

在 Django 中&#xff0c;URL 路由通常使用路径转换器&#xff08;path converters&#xff09;来匹配和捕获 URL 中的特定模式&#xff0c;例如整数、字符串或 slug 等。默认情况下&#xff0c;Django 提供了一些内置的路径转换器&#xff0c;如 <int>、<str>、&l…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量

命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

blender 骨骼的动画基础 笔记总结

一、世界纹理 1.首先打开Node Wrangler&#xff08;世界纹理&#xff09;插件 在编辑的偏好设置这里&#xff0c; 演示一下这个插件&#xff1a; 然后通过shift a添加环境纹理 对其连接颜色后&#xff0c;选中世界纹理&#xff0c;通过按键ctrl t 二、动画 点击动画 1.…

java ssm 健康医馆管理系统 中医馆管理 健康平台 药店 源码jsp

一、项目简介 本项目是一套基于SSM的健康医馆管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

【AI图像生成网站Golang】雪花算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 雪花算法 雪花算法 (Snowflake) 是一种高效、可扩展的分布式唯一ID生成算法&#xff0c;最早由 Twitter 开发&…

[369]基于springboot的高校教师教研信息填报系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校教师教研信息填报系统信息管理难度大&#xff0c;容错…

《素书》:为上计,事当缓;为下计,事当急

《素书》是中国古代一部重要的典籍&#xff0c;相传为秦末黄石公作&#xff0c;内容主要讲述为人处世的道理。其中&#xff0c;“为上计&#xff0c;事当缓&#xff1b;为下计&#xff0c;事当急”这句话&#xff0c;给人以深刻的启示。 首先&#xff0c;对于上策之事&#xf…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上&#xff0c;通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

排序算法(基础)大全

一、排序算法的作用&#xff1a; 排序算法的主要作用是将一组数据按照特定的顺序进行排列&#xff0c;使得数据更加有序和有组织。 1. 查找效率&#xff1a;通过将数据进行排序&#xff0c;可以提高查找算法的效率。在有序的数据中&#xff0c;可以使用更加高效的查找算法&…

计算机网络:运输层 —— TCP 的拥塞控制

文章目录 TCP的拥塞控制拥塞控制的基本方法流量控制与拥塞控制的区别拥塞控制分类闭环拥塞控制算法 TCP的四种拥塞控制方法&#xff08;算法&#xff09;窗口慢开始门限慢开始算法拥塞避免算法快重传算法快恢复算法 TCP拥塞控制的流程TCP拥塞控制与网际层拥塞控制的关系 TCP的拥…

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中&#xff0c;我们经常需要对特定时间段内的数据进行统计和分析。 例如&#xff0c;在名片进线的场景中&#xff0c;我们可能需要了解一天内每小时的名片进线数量。 然而&#xff0c;由于某些时间点可能没有数…