Kotlin数据类型 Unit、Nothing与Nothing?、Any与Any?
Kotlin数据类型 Unit、Nothing与Nothing?、Any与Any?
- Unit类型
Kotlin也是面向表达的语言。在Kotlin中所有控制流语句都是表达式(除了变量赋值,异常等)
Kotlin中Unit类型实现了与java中void一样的功能。
public object Unit {// Unit类型是一个object对象类型
override fun toString() = "kotlin.Unit" // toString函数返回值
}
- 1
- 2
- 3
当一个函数没有返回值的时候,我们用Unit来表示这个特征,而不是null,大多数时候我们不需要显示地返回Unit,或者生命一个函数的返回值是Unit,编译器会推断它。
fun unitExample() {
println("test,Unit")
}
@JvmStatic
fun main(args: Array<String>) {
val helloUnit = unitExample()
println(hellUnit)
println(hellUnit is kotlin.Unit)
}
输出结果
可以看出变量helloUnit的类型是kotlin.Unit类型。以下写法是等价的
fun unitExample():kotlin.Unit {
println("test,Unit")
}
fun unitExample(){
println("test,Unit")
return kotlin.Unit
}
fun unitExample(){
println("test,Unit")
}
跟其他类型一样,Kotlin.Unit的类型是Any。如果是一个可空的Unit?那么父类型是Any?。
- Nothing与Nothing?
在java中void不能是变量的类型,也不能作为值打印输出。但是在java中有个包装类Void是void的自动装箱类型。如果你想让一个方法的返回类型永远是null的话,可以把返回类型为这个大写的Void类型。
public Void testV() {//声明类型是Void
System.out.println("am Void");
return null;//返回值只能是null
}
public static void main(String[] args) {
JavaTest test = new JavaTest();
Void aVoid = test.testV();
System.out.println(aVoid);
}
打印结果如下
这个Void对应的类型是Nothing?,其唯一可被访问的返回值也是null,Kotlin中类型层次结构最底层就是Nothing
Nothing的类定义如下
//Nothing的构造函数是private的,外界无法创建Nothing对象
public class Nothing private constructor()

如果一个函数返回值是Nothing,那么这个函数永远不会有返回值。
但是我们可以使用Nothing来表达一个从来不存在的返回值。例如EmptyList中的get函数
object EmptyList : List<Nothing> {
override fun get(index: Int): Nothing {
throw IndexOutOfBoundsException()
}
}
因为get永远不会反回值,而是直接抛出了异常,这个时候可以用Nothing作为get函数的返回值。
再例如Kotlin标准库里面的exitProcess()函数
@kotlin.internal.InlineOnly
public inline fun exitProcess(status: Int): Nothing {
System.exit(status)
throw RuntimeException("System.exit returned normally, while it was supposed to halt JVM.")
}
Unit与Nothing之间的区别是,Unit类型表达式计算结果返回值是Unit;Nothing类型表达式计算结果永远是不会反回的,与java中void相同。
Nothing?可以只包含一个值 null 。
Nothing?唯一允许的值是null,可被用作任何可空类型的空引用。
- Any?是可空类型的根。Any?是Any的超集,Any?是Kotlin类型层次的最顶端。
println(1 is Any)
println(1 is Any?)
println(null is Any)
println(1 is Any?)
println(Any() is Any?)
输出如下
true
true
false
true
true
有关Kotlin编程电子书收藏(下载地址)
Kotlin数据类型 Unit、Nothing与Nothing?、Any与Any?的更多相关文章
- Kotlin 数据类型(数值类型)
Kotlin 的常见数据类型: 类型 范围 byte -128~127 short 32767-32768 int -2147483648~2147483647 long 92233720368547 ...
- Kotlin 数据类型(字符类型)
Kotlin有两种常见的字符类型. 第一种是String,第二种char. String String 的类型的赋值必须是用双引号的. 格式: var name="Arm830" ...
- Kotlin——初级篇(八):关于字符串(String)常用操作汇总
在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin--初级篇(三):数据类型详解这篇文章. 在 ...
- Kotlin——关于字符串(String)常用操作汇总
在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin——初级篇(三):数据类型详解这篇文章. 在 ...
- 1.scala基础语法总结
Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...
- spark之scala快速入门
scala和java都是在jvm之上的语言,相对来讲,scala热度比较低,其实并不是一个特别好的语言选择. 原因倒不是因为scala本身的缺点,而是使用人群不够多,论坛和社区不够活跃.这就跟社交软件 ...
- Kotlin入门第三课:数据类型
前文链接: Kotlin学习第一课:从对比Java开始 Kotlin入门第二课:集合操作 初次尝试用Kotlin实现Android项目 Kotlin的数据类型与Java类似,因此这篇文章主要看Kotl ...
- Kotlin——最详细的数据类型介绍
任意一种开发语言都有其数据类型,并且数据类型对于一门开发语言来说是最基本的构成,同时也是最基础的语法.当然,kotlin也不例外.kotlin的数据类型和Java是大致相同的,但是他们的写法不同,并且 ...
- Kotlin 基本数据类型
Kotlin 的基本数值类型包括 Byte.Short.Int.Long.Float.Double 等.不同于Java的是,字符不属于数值类型,是一个独立的数据类型. 类型 位宽度 Double 64 ...
随机推荐
- 编程判断输入的字符是否为‘y’或‘Y’,若是,则输出‘yes’,否则输出‘no’
#include<stdio.h>void main(){ char ch; ch=getchar(); ch == 'y' || ch == 'Y' ? printf("yes ...
- 5.5(OI一本通开始)
一, 第一个程序有错误, 1, 每个语句(每行?0)要有分号
- PHP流程控制之分支结构switch语句的使用
分支结构switch语句的使用 还记得我们最开始讲了这么一个故事: 王同学家里头特别有钱,所以他的行程方式和正常人的又有些不一样. 他的出行方式呢有6种,如下: 1,司机开车2,民航3,自己家的专机4 ...
- 自用ajax的json请求
function singlePriceSubmit(){ var json={}; json["area"]=areaStr1; json["goodCateIdStr ...
- 自用java购物
@RequestMapping("listgoodscart") public ResultEntity listGoodsCart(@RequestParam(name = &q ...
- HEXO的使用
本文将总结性的介绍如何建立自己的github.io博客,后续会持续补充,进阶.感谢baixin提供的参考文章. 技术选型为github+hexo+idea,首先最简单的阐述下这个东西都干嘛的 1. 技 ...
- 洛谷P1288取数游戏2
题目 博弈论. 考虑先手和后手的关系.然后可以通过统计数值不是0的数的个数来得出答案. \(Code\) #include <bits/stdc++.h> using namespace ...
- 深度Linux /etc/profile 环境变量生效问题
/etc/profile 环境变量生效问题 设置了环境变量后 ,使用source /etc/profile生效后,每次关闭终端后,都需要重新输入source /etc/profile命令使环境变量生效 ...
- java学习笔记(3)数据类型、源码、反码、补码、精度损失、基本数据类型互相转换
关于java中的数据类型: 1.数据类型的作用是什么? 程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据占用的空间大小不同. 数据类型的作用是指导java虚拟机(JVM)在运行程序的 ...
- Maven+SSM整合ehcache