Kotlin核心编程知识点-03-类型系统

文章目录

  • 1.null 引用
  • 2.可空类型
    • 2.1.安全的调用 ?.
    • 2.2.Elvis 操作符 ?:
    • 2.3.非空断言 !!.
    • 2.4.类型检查
    • 2.5.类型智能转换
  • 3.比 Java 更面向对象的设计
    • 3.1.Any:非空类型的根类型
    • 3.2.Any?: 所有类型的根类型
    • 3.3.自动装箱和拆箱
    • 3.4.数组类型
  • 4.泛型:让类型更加安全

1.null 引用

null,不多解释,都知道代表了什么,比如:该值没有初始化、不合法、不需要、不存在。

其次,就是我们熟知 NullPointerException 问题,它往往让我们编写的 Java 程序变得脆弱。虽然 Java 中也针对它做了很多事情,例如 自定义异常、注解@NotNull、Optional等。

2.可空类型

Kotlin 提供了一种崭新的思路来解决由 null 引发的问题,这就是在类型层面提供一种“可空类型”。这在处理 NEP 问题上非常容易。

在 Kotlin 中,我们可以在任何类型后面加上“?”,比如“Int?”,实际上等同于“Int?=Int or null”。先看一个示例:

// 允许s为null
val s: String? = null
// 没有报错,而是打印了 null
println(s?.length)

如上,这里的 ?. 称为安全调用,当 s 存在时,才会调用 length 方法。

2.1.安全的调用 ?.

如上示例

2.2.Elvis 操作符 ?:

类似于 Java 的三目运算,但 Kotlin 是类型安全的,如下:

    // 允许s为nullval s: String? = nullval result = s?.length ?: "没有值"// 打印结果:没有值println(result)

2.3.非空断言 !!.

// 允许s为null
val s: String? = null// 报错:NullPointerException
println(s!!.length)

如上,如果 s.length 为 null 时就会报错 NEP。

2.4.类型检查

要判断一个对象是什么类型。在 Java 中,一般使用 A instanceof T 来判断 A 是 T 或者 T 的子类的一个实例。而在 Kotlin 中,我们可以用“is”来判断。如下:

// 允许s为null
val s: String = "ddd"// 打印结果分别是 true 和 false
println(s is String)
println(s !is String?)

2.5.类型智能转换

Kotlin 中可以将一个变量的类型转变为另一个种类,隐式完成的,如下:

var s: Any = "Hello"
// true
println(s is String)s = 6
// false
println(s is String)

3.比 Java 更面向对象的设计

在 Kotlin 的类型系统中,并不区分原始类型(基本数据类型)和包装类型,我们使用的始终是同一个类型。虽然从严格意义上,我们不能说 Kotlin 是一门纯面向对象的语言,但它显然比 Java 有更纯的设计。

让我们一起来看看Kotlin的类型结构,如下:
在这里插入图片描述

需要注意的是,以上的类型结构中省略了除 String、Int 之外的一些原生类型,比如Double、Long等。

3.1.Any:非空类型的根类型

与 Object 作为 Java 类层级结构的顶层类似,Any 类型是 Kotlin 中所有非空类型(如String、Int)的超类,如上图所示。

与 Java 不同的是,Kotlin 不区分“原始类型”(primitive type)和其他的类型,它们都是同一类型层级结构的一部分。如果定义了一个没有指定父类型的类型,则该类型将是 Any 的直接子类型。

如果你为定义的新类型指定了父类型,则该父类型将是新类型的直接父类型,但是新类型的最终根类型为 Any。

如果你的类型实现了多个接口,那么它将具有多个直接的父类型,而 Any 同样是最终的根类型。

另外,Kotlin 把 Java 方法参数和返回类型中用到的 Object 类型看作 Any(更确切地说是当作“平台类型”)。当在 Kotlin 函数中使用 Any 时,它会被编译成 Java 字节码中的 Object。

3.2.Any?: 所有类型的根类型

如果说 Any 是所有非空类型的根类型,那么 Any? 才是所有类型(可空和非空类型)的根类型。这也就是说,?Any? 是 ?Any 的父类型。

3.3.自动装箱和拆箱

我们发现,Kotlin 中并没有 int、float、double、long 这样的原始类型,取而代之的是它们对应的引用类型包装类Int、Float、Double、Long。除了以上代表数值的类型,还有布尔(Boolean)、字符(Char)、字符串(String)及数组(Array)。

3.4.数组类型

Kotlin 中这样创造数组:

// 声明长度为0的数字
val funList = arrayOf()
// 声明并初始化长度为t的数组
val funList = arrayOf(n1,n2 ... nt)

Kotlin 中 Array 并不是一种原生的数据结构,而是一种 Array 类,甚至我们可以将 Kotlin 中的 Array 视作集合类的一部分。

由于 Kotlin 的类型智能转换,编译器能够隐式推断出 funList 元素类型。当然,我们也可以手动指定类型:

value funList = arrayOf<T>(n1, n2 ... nt)

在 Kotlin 中,还为原始类型额外引人了一些实用的类:IntArray、CharArray、ShortArray 等,分别对应 Java 中的i nt[]、char[]、short[] 等。

但是需要注意,IntArray 不是 Array 的子类,两者创建的相同值的对象,不是相同的对象。

4.泛型:让类型更加安全

Kotlin 的泛型就不多说了,和 Java 的很相似,百度看一下示例即可。

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

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

相关文章

C语言---扫雷游戏的实现

1.扫雷游戏的分析和设计 需要创建3个文件夹 test.c----扫雷游戏的测试 game.c----扫雷游戏的实现 game.h----扫雷游戏的实现 雷的信息使用二维数组存放 • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认…

CVPR2024《RMT: Retentive Networks Meet Vision Transformers》论文阅读笔记

论文链接&#xff1a;https://arxiv.org/pdf/2309.11523 代码链接&#xff1a;https://github.com/qhfan/RMT 引言 ViT近年来在计算机视觉领域受到了越来越多的关注。然而&#xff0c;作为ViT的核心模块--自注意力缺乏空间先验知识。此外&#xff0c;自注意力的二次计算复杂度…

C++:类

①引用 ②函数重载 函数重载:函数名相同,函数参数类型和顺序不同,仅函数返回值不同不能视为函数重载。 函数重载体现函数的多态性(即一个接口,多种方法),程序在编译时决定调用函数。是面向对象编译领域的核心,属于C++的静态绑定。 作用:方便 与默认参数一起使用时…

Spring和Servlet的整合

Servlet对象是谁创建的&#xff1f; 由服务器端创建的 程序启动调用加载spring配置文件代码 Web应用程序启动也需要加载Spring配置文件 Web开发中有三大组件&#xff1a; 1、servlet 2、filter 3、listener&#xff08;request&#xff0c;session&#xff0c;application&…

Nacos 下载及启动

环境准备 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows&#xff0c;推荐选用 Linux/Unix/Mac。64 bit JDK 1.8&am…

如何确保大模型 RAG 生成的信息是基于可靠的数据源?

在不断发展的人工智能 (AI) 领域中&#xff0c;检索增强生成 (RAG) 已成为一种强大的技术。 RAG 弥合了大型语言模型 (LLM) 与外部知识源之间的差距&#xff0c;使 AI 系统能够提供更全面和信息丰富的响应。然而&#xff0c;一个关键因素有时会缺失——透明性。 我们如何能够…

学习Javascript中的对象

1.什么是对象 对象&#xff08;Object&#xff09;&#xff1a;Javascript里面的一种数据类型&#xff08;引用类型&#xff09;&#xff0c;也是用于存储数据的。 好处&#xff1a;可以用来详细的描述某个事物&#xff0c;是用键值对形式存储语义更明了。 特点&#xff1a;…

LabVIEW软件需求分析文档内容和编写指南

编写LabVIEW软件需求分析文档&#xff08;Software Requirements Specification, SRS&#xff09;是软件开发的关键步骤之一。以下是详细的内容结构、编写指南和注意事项&#xff1a; 内容结构 引言 项目背景&#xff1a;简要介绍项目背景和目的。 文档目的&#xff1a;说明需…

Java基础:类的详细说明

Java是一门面向对象的编程语言&#xff0c;所谓的面向对象&#xff0c;简单的说&#xff0c;就是在软件开发过程中&#xff0c;用各种各样的对象实现所需功能。 对象就好像是现实世界中不计其数的物体&#xff0c;根据物体的性质可以将其进行分门别类&#xff1a;石头、锤子、…

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警&#xff0c;Trap是一种主动推送网络设备事件或告警消息的方式&#xff0c;与SNMP轮询&#xff08;polling&#xff09;不同&#xff0c;具有以下几点优势&#xff1a; 1. 实时监控与快速响应 SNMP Trap能够实时…

如何在操作系统中合并 PDF 文件?不同系统有不同的方法

Windows 系统 在 Windows 系统中想要合并 PDF 文件我们可能需要借助一些第三方的软件或者浏览器的插件。 我们可以在 Google 浏览器中的 Chrome 应用商店中输入“Merge pdf”这样就可以搜索到在线合并 PDF 文件的插件&#xff0c;只需要下载到浏览器中就可以直接使用。当然 Ed…

【Unity Shader入门精要 第11章】让画面动起来(二)

1. 顶点动画的原理 顶点动画的原理是&#xff0c;在顶点着色器中按照一定的规则或函数计算得到一段偏移量对顶点进行移动&#xff0c;最后将改变位置后的顶点变换到裁剪空间进行后续的渲染工作。 可见&#xff0c;与纹理动画只是改变从纹理中哪一部分开始显示图案不同&#x…

visual studis 安装教程

1、下载软件 2、直接安装。根据自己的需求选择需要的模板类型。 如果是.net环境&#xff0c;可以选择.net项目&#xff1b; 如果是c环境&#xff0c;可以选择c项目模板&#xff0c;多个模板可以同时并存。 3、选择C模板&#xff0c;然后重新启动项目。 我是小路&#xff0c;一枚…

使用小猪APP分发打造高效的App封装工具

你是否曾经因为App封装和分发的复杂性而头疼不已&#xff1f;在这个移动应用迅速发展的时代&#xff0c;开发人员不仅需要专注于应用的功能和用户体验&#xff0c;还必须面对繁琐的封装和分发过程。幸运的是&#xff0c;小猪APP分发www.appzhu.cn正好为我们提供了一个简便而高效…

手绘任意波

更多内容&#xff0c;请访问我的网站&#xff1a;https://jiangge12.github.io/ 上位机发送手绘波形数据&#xff0c;下位机接收并输出。 支持 STM32 STC arduino Pico 等多种单片机&#xff0c;内置或外置 DAC 实现。

方法论与技术栈双管齐下的运维可用性能力建设(六)

2&#xff09;实战演练 &#xff08;1&#xff09;非交易期的实战切换 非交易期的实战切换和前面“例行可用性演练”中的切换差不多&#xff0c;只是切换后不马上切换回来&#xff0c;需要生产系统在备份模块中运行一段时间&#xff0c;或长期运行。比如&#xff0c;单数据中…

大模型额外篇章一:用huggingface的电影评论数据集情感分类训练模型

文章目录 一、介绍和准备1&#xff09;介绍2&#xff09;准备(安装依赖) 二、开始训练 一、介绍和准备 1&#xff09;介绍 工具&#xff1a;huggingface 目的&#xff1a;情感分类 输入&#xff1a;电影评论 输出&#xff1a;标签 [‘neg’,‘pos’] 数据源&#xff1a;https…

「架构」单元测试及运用

在参与管理和研发软件项目的过程中,单元测试的实际运用对于确保最终产品的质量至关重要。以下是一些实际运用的案例和说明。 静态测试的实际运用 在TechCorp的电子商务平台项目中,静态测试作为代码质量保证的第一道防线。开发团队在编写代码的同时,使用SonarQube等静态代码…

【学习Day1】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.1 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&…

在全志H616核桃派开发板上进行音频配置的方法详解

耳机口​ 核桃派板载的3.5mm音频输出口&#xff0c;该接口有一定的输出功率&#xff0c;可以使用耳机或者带功放的扬声器都可以播放声音。 查看音频设备​ 可以使用下面指令来查看音频信息&#xff1a; aplay -l音频播放测试​ 播放系统自带wav音频文件测试, 下面指令的au…