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

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.xdnf.cn/news/18122.html

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

相关文章

Linux:权限相关知识详解

1.shell命令以及运行原理 1.1初步理解认识shell Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell&…

React中常用的钩子

在当今,React的钩子写法已经逐渐成为了一种主流开发模式,本文将介绍几种在React中常用的钩子 useState 可以用来双向绑定,创建需要监听变化并且使用的数据 使用该钩子定义时,参数可以是一个直接定义好的变量,也可以是…

.NET SDK 各操作系统开发环境搭建

一、Win10(推荐) 1、VS 2022 社区版 # 下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ 2、.NET 6 SDK # 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 3、Hello World 如果需要使用旧程序样式时,则…

Linux 下网络套接字(Socket) 与udp和tcp 相关接口

文章目录 1. socket常见API2 sockaddr结构体及其子类1. sockaddr结构体定义(基类)2. 子类 sockaddr_in结构体用于(IPv4)3 子类 sockaddr_un(Unix域套接字)4. 总结画出其结构体 3.实现一个简单的tcp Echo 服务器和客户端(cpp)3.1 客户端3.2 服…

跨平台WPF框架Avalonia教程 七

数据绑定 Avalonia使用数据绑定将数据从应用程序对象传递到UI控件,根据用户输入更改应用程序对象中的数据,并在响应用户命令时对应用程序对象进行操作。 在这种安排中,控件是绑定目标,而对象是数据源。 Avalonia运行数据绑定系统…

日常ctf

1, [陇剑杯 2021]日志分析(问1) %2e 为URL编码的符号 "." flag{www.zip} 2, [陇剑杯 2021]日志分析(问2) 根据之前题目的分析,在获取到源码文件之后,黑客又成功访问了in…

基于微信小程序的校园助手+LW示例参考

1.项目介绍 项目角色:管理员、普通用户功能模块:管理员(用户管理、寻物启事管理、物品分类管理、表白广场、吐槽大会、二手交易、拼车出行等)、普通用户(登录注册、寻物启事、失物招领、表白广场、吐槽大会、拼车出行…

逆向攻防世界CTF系列38-xxxorrr

逆向攻防世界CTF系列38-xxxorrr 64位无壳,很自然的找到main和一个比较函数 以为逻辑很简单了 enc [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46,0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0…

数据结构-堆排序笔记

1 思路 总体思路 首先我们会拿到一个无序的数组,我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质,直至大顶堆只剩下一个元素。 具体思路 首先我们先将一个…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件(此处是tsx、直接用app或者jsx也行) import { useState, useEffect } from react impo…

跨平台WPF框架Avalonia教程 六

添加交互性 用户界面的一个基本功能是与用户进行交互。在Avalonia中,您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。 处理事件​ Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处…

【传知代码】VRT_ 关于视频修复的模型

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ VRT_ 关于视频修复的模型 背景介绍:重要性: VRT的重要性和研究背景VRT的背景:VRT的重要性: 视…

药界互联:中药实验管理的网络化

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足,创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

【Linux】进程字段、环境变量与进程地址空间

🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想,准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

基于isSpring的PPT转换

背景 PPT课件目前还是一项在教学中高度频繁使用的工具,对于在线教学就更为重要了。如何把PPT转换为在线web,同时保留更多的PPT特性(动画、音效、视频)呢?这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一…

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代,人工智能(AI)技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式,还极大地丰富了消费者的购物体验。随着技术的不断进步,AI在电商领域的应用越来越广泛,从个性…

【Linux】环境变量

目录 一、什么是环境变量: 1、系统命令搜索路径(PATH): 2、HOME: 3、SHELL: 4、添加环境变量: 二、通过代码获取环境变量: 三、主函数参数: argc表: envp表&…

28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

密码算法简介 1.对称加密算法:加密和解密算法一样 2.非对称加密算法:公钥加密、私钥解密 3.摘要算法:不能解密,不可逆 简单介绍了解一下: 一、对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法…