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,一经查实,立即删除!

相关文章

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

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

Spring和Servlet的整合

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

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

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

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 实现。

【学习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…

控制台生产厂家生产流程详解

控制台生产厂家的生产流程是一个复杂而精细的过程&#xff0c;它涉及多个环节&#xff0c;从原材料的准备到最终产品的出厂检验&#xff0c;每一步都至关重要。以下是控制台生产厂家的一般生产流程&#xff1a; 厂家会根据客户的需求和市场趋势进行产品设计。设计师会综合考虑控…

闪电加载:Hexo博客性能优化全攻略

巴索罗缪大熊 前言 这些年积累了很多前端性能优化的知识点和思路&#xff0c;日常工作很少涉及技术层极限优化&#xff0c;近期终于一点点把博客独立搭建并部署了&#xff0c;对之前的一些技术点进行了深度探索&#xff0c;最终结果也达到了预期效果&#xff0c;由于水平有限&…

河北奥润顺达集团研究院PMO经理常江南受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 河北奥润顺达集团研究院PMO经理、研发部运营管理办负责人常江南先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“初建PMO的体系宣贯和人员培养实践总结”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xf…

如何利用云平台上更好地规划安全生产教育与培训

在平台上进行安全教育和培训&#xff0c;可以采取以下步骤和策略&#xff0c;以确保教育的有效性和参与度&#xff1a; 一、明确教育目标和培训内容 确定教育目标&#xff1a;明确希望员工通过培训达到的安全意识和技能水平。 制定培训内容&#xff1a;根据行业特点、岗位需求…

centos7安装python-gdal环境

python3 yum install python3 python3-pip -y gdal-3.6.2 参考编译postgis python安装gdal export CPLUS_INCLUDE_PATH/usr/local/gdal-3.6.2/include export C_INCLUDE_PATH/usr/local/gdal-3.6.2/include export LDFLAGS"-L/usr/local/gdal-3.6.2/lib64" pip3…

wordpress子比主题文章付费发卡插件

插件仅适用于子比主题 插件演示 免费下载 &#xff1a;子比主题文章付费发卡插件_麦田吧 如下图&#xff0c;添加卡密支持批量添加&#xff0c;按照卡号&#xff08;英文逗号/空格/—-&#xff09;密码的格式输入&#xff0c;一行一条&#xff0c;可以直接添加数据&#xff0…

​​人工智能_大模型083_大模型时代机遇02_提示词优化开发工具_立项_计量模式_真实需求_5why法---人工智能工作笔记0218

上一节我们提供了一个非常好用的提示词,优化开发的,调试工具 vellum 可以看到是这个工具 使用的时候,写完一段提示词,可以选择不同的模型,看看给出的效果情况 对应的模型非常多. ### 立项在立项阶段,要对这三个要素有初步的答案:1. 真实需求是什么? 2. 商业模式是什么? 3…